복잡하고 시간이 걸리는 작업을 별도의 프로세스를 생성해 병렬처리해 보다 빠른 응답처리 속도를 기대할 수 있게 해준다

딥러닝 / 머신러닝같은 대용량의 빅데이터를 분석하고 예측해야 하는 task에서는 멀티 프로세싱을 통해 멀티코어의 CPU의 장점을 극대화하고 빠른 처리를 지원할 수 있다

<aside> 💡 병렬프로그래밍에 대한 충분한 공부 없이 코드를 작성하면 싱글프로세스보다 시간이 지연되거나 잘못된 결과가 발생할 수 있어 프로세스 / 쓰레드에 대한 이해가 필요합니다

</aside>

간단히 parallel processing 과 serial processing을 비교하면 다음과 같다

Untitled

Pool 예시

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()
  1. pool 객체 생성
  2. 이미지 리스트에 있는 이미지 경로마다 pool.apply_asyn으로 작업을 배정
  3. close 호출로 리소스 낭비 방지
  4. join 함수로 작업완료 대기

여러 매핑함수

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)