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을 활용한 멀티프로세싱 방법은
- Pool을 활용하여 원하는 만큼의 수인 프로세스를 할당한다. (multiprocessing.Pool(processes))
- map 함수를 활용하여 각 프로세스에 처리할 업무를 할당한다. (pool.map(func, iterable))
- 모든 작업이 완료되면 close()를 통해 pool의 프로세스들을 종료하며, join()은 pool의 모든 프로세스가 종료가 완료가 되는 것을 기다린다. (pool.close() , pool.join())
이 3단계를 통해 간단히 구현할 수 있다.
728x90