프로세스마다 인터프리터와 GIL, 메모리가 따로 있어 CPU 작업을 실제 병렬로 돌릴 수 있어. 대신 시작과 pickle 직렬화 비용이 크므로 작업이 충분히 무거워야 이겨.
ProcessPoolExecutor는 스레드 풀과 같은 API를 쓰지만 함수는 최상위에 있고 인자·결과가 pickle 가능해야 해. 메인 가드도 필요해. 큰 객체를 매 작업에 복사하지 말고 작은 입력, 충분히 큰 계산, 필요한 결과만 돌려줘. 공유 Manager나 shared_memory는 정말 공유가 필요한 경우에만 써.