Python에는 스레드, 프로세스, 비동기 I/O라는 서로 다른 동시성 도구가 있다. 작업 성격에 따라 고른다.
| 작업 | 보통의 선택 |
|---|---|
| 파일·네트워크 대기 | 스레드 또는 asyncio |
| CPU를 오래 쓰는 Python 계산 | multiprocessing |
| 많은 소켓을 한 이벤트 루프로 처리 | asyncio |
스레드는 메모리를 공유해 전달이 쉽지만, 공유 변경 상태에는 락이 필요하다. 프로세스는 메모리를 분리해 CPU 코어를 쓰지만 직렬화와 프로세스 시작 비용이 든다.
`concurrent.futures`의 ThreadPoolExecutor와 ProcessPoolExecutor는 같은 submit/map 형태로 시작하기 좋다. 작업 함수와 입력은 프로세스 경계를 넘을 수 있게 직렬화 가능해야 한다.
동시 실행이 항상 빠른 것은 아니다. 작은 작업은 스케줄링 비용이 더 크고, 외부 서비스의 요청 제한을 넘길 수 있다. 작업량과 병렬 수를 측정한다.
댓글
0개아직 댓글이 없습니다.