카테고리 없음
python - multiprocessing, pool, process
jaeha_lee
2023. 6. 29. 01:02
키워드 : pool, process, pool.starmap
대용량, 많은 양의 데이터를 옮기고 이동하면서 병렬 프로그래밍의 필요성을 느끼고 얻게 된 내용을 정리하고자 한다.
(이론보다는 코드 기반으로...)
python은 기본적으로 multiprocessing이라는 라이브러리가 있고,
여기서 pool과 process가 있다.
두개는 명확히 다르나 지금 당장은 병렬 프로그래밍을 위해서 필요하고 그 쓰임새는 비슷하다고 판단
from multiprocessing import Pool, Process
import multiprocessing
import time
def test_multiprocess(x):
for i in x:
print(i)
time.sleep(1)
if __name__ == '__main__':
import os
cpu_ = os.cpu_count()
pool = multiprocessing.Pool(cpu_)
data = ['apple','banana']
pool.starmap(test_multiprocess, [(fruit, ) for fruit in data] )
pool.close() # close the process pool
pool.join() # wait a moment
// 출력 결과
a
b
p
a
p
n
l
a
e
n
a
이렇듯, 순서대로 출력되지 않고 각각 동시에 다른 프로세스에서 실행된다.
pool의 사용법은 다음과 같다.
pool.startmap( 함수명, [ 튜플형태의 데이터들 ])
# ex 인자 하나
pool.starmap(test_multiprocess, [(튜플1), (튜플2), ... ] )
# Ex 인자 2개 이상
pool.starmap(test_multiprocess, [("인자1", '인자2", ...), ...] )
참고로, 튜플의 경우 (1)은 튜플이 아니다. (1,)이 튜플
코드 예시 및 출력
from multiprocessing import Pool, Process
import multiprocessing
import time
def test_multiprocess(x):
for i in x:
print(i)
time.sleep(0.5)
def test_multiprocess_multipe_args(x,y):
for i in x:
print(i+y)
time.sleep(0.5)
if __name__ == '__main__':
import os
cpu_ = os.cpu_count()
pool = multiprocessing.Pool(cpu_)
data = ['apple','banana']
pool.starmap(test_multiprocess, [(fruit, ) for fruit in data] )
pool.starmap(test_multiprocess_multipe_args
, [(fruit, "-TEST") for fruit in data] )
pool.close()
pool.join()
########## 출력 ##########
a
b
a
p
p
n
l
a
e
n
a
a-TEST
b-TEST
a-TEST
p-TEST
p-TEST
n-TEST
l-TEST
a-TEST
e-TEST
n-TEST
a-TEST