반응형
프로그램의 실행 속도는 프로그래밍의 아주 중요한 요소입니다. Python에서 프로세스 기반의 병렬 처리를 통해 실행 속도를 향상 시킬 수 있는 방법에 대해서 알아보겠습니다.
Python에서는 병렬 처리를 위해 multiprocessing 패키지를 제공합니다. multiprocessing에는 대표적으로 Pool과 Process가 있지만 이번 글에서는 Process에 대해서만 다루도록 하겠습니다.
multiprocessing.process
Process는 미리 정의한 함수를 하나의 프로세스에 할당하여 실행합니다. 이때, 각 프로세스마다 적당한 인자값을 할당하여 실행할 수 있습니다.
[example code]
import os
from multiprocessing import Process
def add_one(num):
p_id = os.getpid()
print('({} + 1) done by ---> process {}'.format(num, p_id))
num += 1
if __name__ == '__main__':
nums = range(1, 10)
procs = []
for idx, num in enumerate(nums):
proc = Process(target=add_one, args=(num,))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
[output]
(1 + 1) done by --> process 24696
(9 + 1) done by --> process 3624
(3 + 1) done by --> process 16288
(6 + 1) done by --> process 23852
(5 + 1) done by --> process 26036
(7 + 1) done by --> process 10276
(2 + 1) done by --> process 18812
(8 + 1) done by --> process 18928
(4 + 1) done by --> process 704
example code를 보시면 하나의 프로세스를 Process(target=add_one, args=(num,))으로 생성합니다. 여기서 target에는 함수를 args에는 인자를 할당하는 것을 확인할 수 있습니다.
multiprocessing.Manager()
Process를 쓰면서 변수를 공유해야 할 수도 있습니다. 이때 사용하는 것이 Manager()입니다. Manager()를 통해서 List 또는 Dict 등의 변수를 공유할 수 있습니다.
[example code]
import multiprocessing
manager = multiprocessing.Manager()
final_list = manager.list()
input_list_one = ['one', 'two', 'three', 'four', 'five']
input_list_two = ['six', 'seven', 'eight', 'nine', 'ten']
def worker(data):
for item in data:
final_list.append(item)
process1 = multiprocessing.Process(target=worker, args=[input_list_one])
process2 = multiprocessing.Process(target=worker, args=[input_list_two])
process1.start()
process2.start()
process1.join()
process2.join()
print(final_list)
[output]
['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
위의 예제를 보시면 Manager()로 생성한 list인 final_list를 2개의 프로세서가 공유하여 각 리스트를 합친 결과를 확인할 수 있습니다. list뿐만 아니라 dict, array, value 등 다양한 변수를 선언하여 공유할 수 있습니다.
Reference
반응형
'프로그래밍 > [ Python ]' 카테고리의 다른 글
[1-1] 코딩 인터뷰 (0) | 2020.11.17 |
---|---|
[Python] bisect (0) | 2020.08.24 |
[Python] 슬라이싱(slicing) 기본 (0) | 2020.08.18 |
[Python] 문자열 활용법 정리 (0) | 2020.08.18 |
[Python] pickle (데이터 저장 및 불러오기) (0) | 2020.06.02 |