복잡하고 시간이 걸리는 작업을 별도의 프로세스를 생성해 병렬처리해 보다 빠른 응답처리 속도를 기대할 수 있게 해준다
딥러닝 / 머신러닝같은 대용량의 빅데이터를 분석하고 예측해야 하는 task에서는 멀티 프로세싱을 통해 멀티코어의 CPU의 장점을 극대화하고 빠른 처리를 지원할 수 있다
<aside> 💡 병렬프로그래밍에 대한 충분한 공부 없이 코드를 작성하면 싱글프로세스보다 시간이 지연되거나 잘못된 결과가 발생할 수 있어 프로세스 / 쓰레드에 대한 이해가 필요합니다
</aside>
간단히 parallel processing 과 serial processing을 비교하면 다음과 같다

from multiprocessing import Pool
## crop_image: 이미지를 랜덤하게 자르는 함수
pool = Pool(opt['n_thread'])
for path in img_list:
pool.apply_async(
crop_image, args=(path, opt), callback=lambda arg: pbar.update(1))
pool.close()
pool.join()
pool.apply_asyn으로 작업을 배정
apply_async
(func [, args [, kwds [, callback [, error_callback]]]])
| multi-args | concurrence | blocking | ordered-results | |
|---|---|---|---|---|
| map | X | O | O | O |
| apply | O | X | O | X |
| map_async | X | O | X | O |
| apply_async | O | O | X | X |
map / map_async는 한번에 job 리스트가 넘겨지지만
results = pool.map(worker, [1, 2, 3])
pool.map_async(worker, jobs, callback=collect_result)
apply / apply_async는 하나의 job만 넘겨진다( 예시코드처럼 loop가 필요하다 )
for x, y in [[1, 1], [2, 2]]:
results.append(pool.apply(worker, (x, y)))
def collect_result(result):
results.append(result)