Python Multiprocessing

김윤하·2022년 10월 9일

Python

목록 보기
4/11

1. Multiprocessing 이란?

  • Process란 운영체제에서 생성(fork)되며 메모리에 적재되어 실행되는 프로그램으로 여러개의 process를 생성하여 병렬적으로 처리하는 기법
  • 단 python에서는 GIL(Global Interpreter Lock) 때문에 한 프로세스에서 동시간에 한가지 thread만을 실행하도록 하기 때문에 multithread보다는 multiprocessing을 권장
  • Context switching이 느림

2. pool & process

파이썬에서는 multiprocessing.pool, multiprocessing.Process 를 많이 사용한다.

1. Pool

실행시키고자 하는 함수를 process 에 분배하여 병렬처리 할 수 있다.

def func():
	...

pool = Pool(n_cores)
pool.map(func, nums)
pool.close()
pool.join()

2. Process

Process는 하나의 프로세스에 하나의 함수를 할당하여 실행하는 방식이다.

def func():
	...

procs = []

proc = Process(target=func, args=(num,))
procs.append(proc)
proc.start()

3. Pool 함수와 Process 함수의 실행 방법의 차이점

Pool은 처리할 일을 바닥에 뿌려놓고 알아서 분산 처리를 하게 만드는 방식이고 Process는 각 프로세스별로 할당량을 명시적으로 정해준 뒤 실행되는 방식이다.

🔧 기타 팁

  • from multiprocessing import Queue를 사용하는 경우 process가 join해도 안끝나는 경우가 생김
from multiprocessing import Queue
q = Queue()
↓
from multiprocessing import Manager
manager = Manager()
q = manager.Queue()

  • Pool 멀티프로세싱에서 함수에 여러 parameter를 넣고 싶을때
from functools import partial
from multiprocessing import Pool


def func(input1, input2):
	...
    

PROCESS_COUNT = 10

func2 = partial(func, input2=input2_df)
df_split = np.array_split(input1_df, PROCESS_COUNT)
pool = Pool(PROCESS_COUNT)
final_df = pd.concat(pool.map(func2, df_split))
pool.close()
pool.join()
profile
data engineer

0개의 댓글