multiprocessing은 「여러 개의 별도 프로세스를 동시에 돌려 진짜 CPU 병렬 처리를 하는」 표준 라이브러리입니다.
threading의 GIL 한계를 우회해 CPU 집약 작업을 여러 코어에서 동시에 처리할 수 있습니다.
기본 사용.
from multiprocessing import Process.
def heavy_calc(n): return sum(i*i for i in range(n)).
p = Process(target=heavy_calc, args=(1000000,)); p.start(); p.join().
API는 threading과 비슷하지만 별도 프로세스이므로 GIL 영향이 없습니다.
Pool로 더 편하게.
from multiprocessing import Pool.
with Pool(4) as pool: results = pool.map(heavy_calc, [1000000]*10).
4개 워커 프로세스가 10개 작업을 나눠 처리.
CPU가 4코어라면 거의 4배 빠른 결과.
프로세스 vs 스레드.
프로세스는 「완전 독립」 — 메모리 공유 없음, 통신은 큐·파이프로.
무겁지만 안전.
스레드는 「메모리 공유」 — 가볍지만 동기화 문제 있음.
「I/O 대기 → threading, CPU 계산 → multiprocessing」이 일반 원칙입니다.
함정.
프로세스 시작 비용이 큽니다(스레드의 100~1000배).
작은 작업을 많이 처리하면 「병렬화 비용」이 「병렬화 이득」을 넘을 수 있어 오히려 느려집니다.
큰 작업 단위로 나누는 게 효율적이고, 데이터 전달 비용(pickle 직렬화)도 고려해야 합니다.
한 줄 요약
multiprocessing은 별도 프로세스로 진짜 CPU 병렬 처리를 합니다.
GIL을 우회해 CPU 집약 작업에 강하며, Pool로 편하게 워커를 관리할 수 있습니다.
프로세스 시작 비용에 주의.
더 알아볼 것
- concurrent.futures.ProcessPoolExecutor
- 공유 메모리(SharedMemory) — 3.8+
- 대안 — Joblib·Dask