카테고리 없음

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