[multiprocessing / IPC] Event

About_work·2024년 2월 16일
0

process, thread

목록 보기
18/23

언제 쓰는가? 장단점?

개요

  • 프로세스 간에 이벤트를 통해 신호를 보낼 수 있게
  • 이를 통해 여러 프로세스가 특정 이벤트의 발생을 기다리고, 이벤트가 발생하면 동시에 또는 특정 조건하에 동작을 시작

사용 예시

from multiprocessing import Process, Event
import time

def wait_for_event(e):
    print("wait_for_event: starting")
    e.wait()  # 이벤트가 설정될 때까지 대기
    print("wait_for_event: e.is_set()->", e.is_set())

def wait_for_event_timeout(e, t):
    print("wait_for_event_timeout: starting")
    e.wait(t)  # t초 동안 이벤트가 설정될 때까지 대기
    print("wait_for_event_timeout: e.is_set()->", e.is_set())

if __name__ == "__main__":
    e = Event()

    w1 = Process(target=wait_for_event, args=(e,))
    w2 = Process(target=wait_for_event_timeout, args=(e, 2))

    w1.start()
    w2.start()

    time.sleep(3)  # 3초 대기
    e.set()  # 이벤트 설정, w1은 계속 진행될 것이고, w2는 이미 타임아웃으로 종료됨

    w1.join()
    w2.join()
  • 이 예시에서는 두 개의 프로세스가 이벤트를 대기하고 있으며, 하나는 무한히 대기하고 다른 하나는 타임아웃이 설정된 상태로 대기
  • 주 프로세스에서는 3초 후에 이벤트를 설정하여 wait_for_event 함수를 실행하는 프로세스가 계속 진행되도록 하고, 타임아웃이 설정된 함수를 실행하는 프로세스는 타임아웃 후에 진행됩니다.

메서드(Methods)

  1. __init__(self)

    • 초기화 메서드로, Event 인스턴스를 생성합니다.
    • 파라미터: 없음
    • 리턴 값: 없음
  2. set(self)

    • 이벤트 상태를 True로 설정합니다. 이 메서드는 이벤트를 발생시키며, 이벤트를 기다리고 있는 모든 프로세스가 이벤트가 발생했다는 신호를 받음
    • 파라미터: 없음
    • 리턴 값: 없음
  3. clear(self)

    • 이벤트의 상태를 False로 리셋합니다. 이 메서드는 이벤트를 비활성화
    • 파라미터: 없음
    • 리턴 값: 없음
  4. is_set(self)

    • 이벤트의 현재 상태를 반환합니다. 이벤트가 설정되어 있으면 True, 그렇지 않으면 False를 반환합니다.
    • 파라미터: 없음
    • 리턴 값: bool. 이벤트가 설정되어 있으면 True, 그렇지 않으면 False.
  5. wait(self, timeout=None)

    • 이벤트가 설정될 때까지 또는 선택적 타임아웃이 발생할 때까지 호출 스레드를 블록합니다.
    • 파라미터:
      • timeout (float 또는 None): 선택적 타임아웃 값(초 단위). None인 경우 무한 대기합니다.
    • 리턴 값: bool. 이벤트가 설정되면 True를 반환하고, 타임아웃이 발생하면 False를 반환합니다.

어트리뷰트(Attributes)

multiprocessing.Event 객체에는 사용자가 직접 접근할 수 있는 공개 어트리뷰트가 없습니다. 객체의 상태(이벤트가 설정되었는지 여부)는 is_set() 메서드를 통해 확인할 수 있으며, 이벤트의 상태 변경은 set()clear() 메서드를 통해서만 수행할 수 있습니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글