Python에는 스레드, 프로세스, 비동기 I/O라는 서로 다른 동시성 도구가 있다. 작업 성격에 따라 고른다.

작업보통의 선택
파일·네트워크 대기스레드 또는 asyncio
CPU를 오래 쓰는 Python 계산multiprocessing
많은 소켓을 한 이벤트 루프로 처리asyncio

스레드는 메모리를 공유해 전달이 쉽지만, 공유 변경 상태에는 락이 필요하다. 프로세스는 메모리를 분리해 CPU 코어를 쓰지만 직렬화와 프로세스 시작 비용이 든다.

`concurrent.futures`의 ThreadPoolExecutor와 ProcessPoolExecutor는 같은 submit/map 형태로 시작하기 좋다. 작업 함수와 입력은 프로세스 경계를 넘을 수 있게 직렬화 가능해야 한다.

동시 실행이 항상 빠른 것은 아니다. 작은 작업은 스케줄링 비용이 더 크고, 외부 서비스의 요청 제한을 넘길 수 있다. 작업량과 병렬 수를 측정한다.

Python 23. 동시성의 세 가지 선택의 핵심 흐름도
그림. 동시성 도구는 작업이 기다리는지 계산하는지에 따라 고른다.