Python 으로 multiprocessing 을 해보자 (1)

오영주·2021년 8월 22일
3

Multiprocessing module 과 joblib

  1. multi processing 모듈 : process와 thread기반의 병렬처리를 사용해서 작업을 대기열에 분산시키고, 프로세스 간에 데이터를 공유할 수 있도록 함
    • 주로 단일 컴퓨터의 멀티코어 병렬처리에 초점이 맞춰져 있음 (멀티머신 x)
    • I/O위주의 문제를 병렬화 할때는 OpenMP모듈 사용할 수 있으나 이건 이전장에서 봤던 asyncio 모듈, tornado 가 더 나은 대안
    • multiprocessing 모듈이 처리할 수 있는 전형적인 작업의 예
      1. cpu 위주의 작업을 process 나 pool 객체를 사용해 병렬화 한다
        • python thread 는 os 의 native thread(실제 운영체제가 실행하는 thread, 에뮬레이션 된게 아님), GIL(Global Interpreter Lock) 에 의해 제한되며, 한번에 오직 한쓰레드만 파이선 객체들과 상호작용이 가능함
        • process 를 사용하여 여러 python interpreter 를 병렬로 실행할 수 있고, 각각의 인터프리터는 독립된 메모리공간과 GIL 을 가지며, 각각 순차적으로 실행된다
      2. dummy 모듈을 사용해서 I/O 위주의 작업을 쓰레드를 사용하는 pool 로 병렬화 한다
      3. Queue를 통해 pickling 한 결과를 공유한다 - 그렇기때문에 pickling 이 안되는 객체의 경우에는 사용이 어렵다
      4. 병렬화 한 작업자 사이에서 바이트, 원시데이터 타입, 사전, 리스트 등의 상태를 공유한다
  2. Joblib
    • multiprocessing 라이브러리 위에 만들어짐
    • 여러 플랫폼간의 호환성을 높여주고, 병렬화를 위한 간단한 api 를 제공하며, 캐시된 결과를 편리하게 영속화해줌

Multiprocessing module 주요 구성요소

  • 주요 구성요소
    • process : 현재 프로세스를 포크한 복사본. 포크하고나면 새로운 프로세스 식별자가 부여되며 운영체제상에서 별도의 자식 프로세스로 작업을 실행한다
    • pool : process 나 thread.Trhead api 를 감싸서 사용하기 편한 worker pool 로 만든다. 작업을 공유하고 합쳐진 결과를 반환한다.
    • queue : 여러 producer 와 consumer 가 사용할 수 있는 FIFO 대기열
    • pipe : 두 프로세스 사이의 단방향 또는 양방향 통신채널
    • manager : 프로세스 간에 파이썬 객체를 공유하는 고수준의 관리된 인터페이스
    • 동기화 도구들 : 프로세스 간의 흐름을 동기화하는 락과 세마포어들

(위 내용은 고성능 파이썬(http://www.yes24.com/Product/Goods/30231783)의 내용을 요약한 것 입니다)

profile
data scientist

0개의 댓글