Process - 별도의 프로세스에서 실행되는 작업을 의미.

 

  • parameters
    • group : 항상 None이어야 함. threading.Thread와의 호환성을 위해 존재
    • target : run() 메소드에 의해 호출될 callable 객체. defalut = None
    • name : 프로세스 이름
    • args : target 호출을 위한 인자 튜플
    • kwargs : target 호출을 위한 키워드 인자 딕셔너리
  • method
    • run() : 프로세스의 활동을 나타내는 메소드. 서브 클래스에서 재정의 가능. 표준 run() 메소드는 객체 생성자에 target 인자로 전달된 callable 객체를 호출하는데 args와 kwargs 인자를 각각 위치 인자와 키워드 인자로 사용
    • start() : 프로세스 활동 시작. 프로세스 객체 당 최대 한 번 호출되어야 함. 객체의 run() 메소드가 별도 프로세스에서 호출되도록 함
    • join([timeout]) : 선택적 인자 timeout이 None(default)인 경우, 메소드는 join() 메소드가 호출된 프로세스가 종료될 때까지 블록된다. timeout이 양수면 최대 timeout초동안 블록. 프로세스가 종료되거나 메소드가 시간 초과되면 None을 돌려주게 되므로 주의. 프로세스의 exitcode를 검사해 종료되었는지 확인.
      프로세스는 여러 번 조인할 수 있다.
      교착 상태를 유발할 수 있으므로 프로세스는 자신을 조인할 수 없다. 프로세스가 시작되기 전 프로세스에 조인하려고 하면 에러가 발생한다.
    • name : 프로세스 이름. 식별 목적으로만 사용.
    • is_alive() : 프로세스가 살았는지 죽었는지 반환
    • daemon : start() 호출 전 설정되어야 함. 초깃값은 생성 프로세스에서 상속. 프로세스가 종료될 때 모든 데몬 자식 프로세스를 강제 종료시키려 시도.
    • pid : 프로세스 ID  반환
    • exitcode : 자식 종료 코드
    • authkey : 프로세스 인증 키
    • terminate(), kill() : 프로세스 강제 종료
    • close() : 프로세스와 관련된 모든 자원 해제

 

Pool - 여러 입력 값에 걸쳐 함수 실행을 병렬 처리하고 입력 데이터를 프로세스에 분산시키는 방법 제공 (데이터 병렬 처리)

 

  • Parameters
    • proccesses : 사용할 작업자 프로세스 수. None이면 os.cpu_count()에 의해 반환되는 수가 사용됨
    • initializer : None이 아니면, 각 작업자 프로세스는 시작할 때 initializer(*initargs)를 호출
    • maxtasksperchild : 사용되지 않는 자원을 해제할 수 있도록, 작업 프로세스가 종료되고 새 작업 프로세스로 교체되기 전에 완료할 수 있는 작업 수.
    • context : 작업자 프로세스를 시작하는 데 사용되는 컨텍스트를 지정하는 데 사용할 수 있음.
  • method
    • apply(func[, args[, kwds]]) : 인자 args 및 키워드 인자 kwds를 사용해 func를 호출한다. 결과가 준비될 때까지 블록된다.
    • apply_async(func[, args[, kwds[. callback[, error_callback]]]]) : AsyncResult 객체를 반환하는 apply() 메소드 변형. callback이 지정되면 단일 인자를 받아들이는 callable이어야 한다. 결과가 준비되면 callback을 결과를 인자로 호출한다. 실패한 결과면 error_callback이 대신 적용된다. 콜백은 즉시 완료되어야 하며, 그렇지 않으면 결과를 처리하는 스레드가 블록된다.
    • map(func, iterable[, chunksize]) : map() 내장 함수의 병렬 버전. 하나의 iterable 인자만 지원. 여러 개의 인자를 지원하는 건 starmap(). 결과가 준비될 때까지 블록된다. 이 메소드는 iterable을 여러 묶음으로 잘라 별도 작업으로 프로세스 풀에 제출한다. 이 묶음의 크기는 chunksize를 양의 정수로 설정해 지정가능. 너무 긴 iterable은 높은 메모리 사용을 유발하므로 명시적 chunksize 옵션으로 imap()이나 imap_unordered()를 사용하는 걸 고려해야 한다.
    • map_async(func, iterable[, chunksize[, callback[, error_callback]]]) : AsyncResult 객체를 반환하는 map() 메소드 변형.매커니즘은 apply_async()와 같다.
    • close() : 더는 작업이 풀에 제출되지 않도록 한다. 모든 작업이 완료되면 작업자 프로세스가 종료됨
    • terminate() : 계류 중인 작업을 완료하지 않고 즉시 작업자 프로세스 중지. Pool 객체가 garbage 수집될 때 terminate()가 죽시 호출됨
    • join() : 작업자 프로세스가 종료될 때까지 기다린다. 호출 전 반드시 close()나 terminate()를 호출해야 한다.
  • 그 외
    • imap, imap_unordered, starmap, starmap_async, AsyncResult, etc...

 

Pipe & Queue - 여러 프로세스 사용 시, 프로세스 간 통신을 위해 메시지를 전달하기 위해 Pipe()를 사용할 수 있다.

 

  • multiprocessing.Pipe([duplex])
    • 파이프의 끝을 나타내는 Connection 객체 쌍 (conn1, conn2)를 반환.
    • duplex가 True(default)면 파이프는 양방향.
      False일 시, 단방향. conn1은 메시지 받는 데, conn2는 메시지 보내는 데에만 사용 가능
  • multiprocessing.Queue([maxsize])
    • 파이프와 몇 개의 록/세마포어를 사용해 구현된 프로세스 공유 큐 반환. 프로세스가 처음으로 항목을 큐에 넣으면 버퍼에서 파이프로 객체 전송 피더 스레드가 시작됨
    • method
      • qsize() - 큐 크기 리턴
      • empty() - 큐가 비어 있으면 True, 아니면 False
      • full() - 큐가 가득 차면 True, 아니면 False
        • 위의 세 메소드는 다중 스레딩 / 다중 프로세싱 특성을 타 신뢰할 수 없다.
      • put(obj[, block[, timeout]]) : obj를 큐에 넣는다. block이 True이고 timeout이 None(default)이면 빈 슬롯이 생길 때까지 필요한 경우 블록함. timeout이 양수인 경우, 최대 timeout초만큼 블록하고 그 시간 내 사용 가능 슬롯이 생기지 않으면 queue.Full 예외 발생. block이 False이고 빈슬롯을 즉시 사용 가능하면 항목을 넣으나 그렇지 않으면 queue.Full 예외 발생.(이 경우 timeout은 무시)
      • get([block[, timeout]]) : obj를 큐에서 반환. 매커니즘은 put과 비슷.
      • close() : 현재 프로세스가 이 큐에 더는 데이터를 넣지 않을 것을 나타냄.
      • join_thread() : 배경 스레드에 조인. close()가 호출된 후 사용 가능.
      • cancel_join_thread() : join_thread()의 블록 방지. 프로세스 종료 시 배경 스레드를 자동 조인하는 것을 막음.
    • etc
      • SimpleQueue(록이 걸린 Pipe에 가까움), JoinableQueue

 

 

 

+ Recent posts