11-09 09:15
Notice
Recent Posts
Recent Comments
관리 메뉴

BAN2ARU

[Python] Multiprocessing 본문

Language/Python

[Python] Multiprocessing

밴나루 2022. 4. 10. 16:52
반응형

 멀티 프로세싱(multi processing)은 시간이 오래 걸리고 복잡한 여러 작업들을 별도의 프로세스에 생성하여 이를 병렬 처리(parallel processing)를 하여 작업이 좀 더 빠르게 처리할 수 있도록 한다. 다만, 이 프로세스들은 각자가 고유 메모리 영역을 가지고 있기 때문에 메모리 사용이 늘어난다는 단점이 있으므로 잘 활용해야 한다.

멀티프로세싱 예제

  • 멀티프로세싱 사용여부에 따른 처리속도 비교
# 멀티프로세싱을 활용하지 않았을 때

import time
import os

#1초간 sleep하는 함수
def time_to_sleep(a):
    print(a)
		print(os.getpid)
    time.sleep(1)

sleep_list = ['0', '1', '2', '3']

start = time.time()

for i in sleep_list :
    time_to_sleep(i)

end = time.time() 

print('processing time : %s seconds' %(end - start))
# 결과 화면

0 6220 
1 6220 
2 6220 
3 6220
processing time : 4.028969049453735 seconds

 

# 멀티프로세싱을 활용한 경우 (프로세스 2개)

import time
import multiprocessing
import os

#1초간 sleep하는 함수
def time_to_sleep(a):
		print(a , os.getpid(), end=' ')
    time.sleep(1)
    print(end='\n')

sleep_list = ['0', '1', '2', '3']

start = time.time()

if __name__ == '__main__' :
    pool = multiprocessing.Pool(processes=2)
    pool.map(time_to_sleep, sleep_list)
    pool.close()
    pool.join()

    end = time.time() 

    print('processing time : %s seconds' %(end - start))
# 결과 화면
# os.getpid()를 통해 4개의 업무를 2개의 프로세스에서 각각 실행되는 것을 알 수 있음

0 5072 
1 13052 
2 5072 
3 13052
processing time : 2.1739742755889893 seconds

 

# 멀티프로세싱을 활용한 경우 (프로세스 4개)

import time
import multiprocessing
import os

#1초간 sleep하는 함수
def time_to_sleep(a):
		print(a , os.getpid(), end=' ')
    time.sleep(1)
    print(end='\n')0 3180 
2 16792 
1 8288
3 3720
processing time : 1.1711664199829102 seconds

sleep_list = ['0', '1', '2', '3']

start = time.time()

if __name__ == '__main__' :
    pool = multiprocessing.Pool(processes=4)
    pool.map(time_to_sleep, sleep_list)
    pool.close()
    pool.join()

    end = time.time() 

    print('processing time : %s seconds' %(end - start))
# 결과 화면
# os.getpid()를 통해 4개의 업무를 2개의 프로세스에서 각각 실행되는 것을 알 수 있음

0 3180 
2 16792 
1 8288
3 3720
processing time : 1.1711664199829102 seconds

 

프로세스를 많이 활용할 수록 처리속도가 상당히 줄어든 것을 볼 수 있다.

Python을 활용한 멀티프로세싱 방법은

  1. Pool을 활용하여 원하는 만큼의 수인 프로세스를 할당한다. (multiprocessing.Pool(processes))
  2. map 함수를 활용하여 각 프로세스에 처리할 업무를 할당한다. (pool.map(func, iterable))
  3. 모든 작업이 완료되면 close()를 통해 pool의 프로세스들을 종료하며, join()은 pool의 모든 프로세스가 종료가 완료가 되는 것을 기다린다. (pool.close() , pool.join())

이 3단계를 통해 간단히 구현할 수 있다.

728x90
Comments