노트북
코딩

파이썬을 이용하다 보면 속도 때문에 문제가 발생하는 경우가 있습니다. 코드를 효율적으로 작성해서 시간을 단축할 수도 있지만, 병렬로 처리하면 쉽게 시간을 단축시킬 수 있습니다. 파이썬에는 병렬 처리를 지원하는 패키지도 있지만, 쉽게 내장 모듈인 multiprocessing을 이용하는 방법도 있습니다. 파이썬 multiprocessing을 이용해서 병렬로 처리하는 방법을 알아보았습니다.

 

 

1. Pool 이용하기

multiprocessing의 Pool 모듈을 이용하면, 쉽게 멀티프로세싱을 구현할 수 있습니다. 우선 멀티로 하고 싶은 작업을 함수로 만듭니다. 이때 함수의 입력인자가 하나 있어야 합니다. 이 입력인자 값에 멀티 프로세싱으로 처리하고 싶은 값들을 넣으면 되는데요. 다음으로 Pool에 입력값으로 함수와 리스트를 넣습니다. 병렬 처리가 끝나면 결과값이 리스트로 반환됩니다. 결과값을 처리하고 싶다면, 이 리스트를 처리하면 됩니다.

 

from multiprocessing import Pool

def ran_int(a):
    b = a*a
    return b

p = Pool(processes=1)
rls = p.map(ran_int, [1,2,3])
print(rls)

 

 

멀티프로세싱을 하면 하나의 프로세스에서 에러가 발생해도 오류메시지가 출력되지 않습니다. 그러니 실행하기 전에 잘 작동하는지 한 번 테스트 해 보는 것이 좋습니다.

 

2. 함수 입력인자가 여러 개일 때

병렬처리를 위한 리스트 입력값은 컴프리핸션으로 입력하는 것이 편리합니다. Pool 함수는 편리하지만, 함수에 입력인자를 하나밖에 넣을 수 없다는 단점이 있습니다. 이를 해결하기 위해서는 multiprocessing을 조금 복잡하게 다뤄야 하는데요. multiprocessing을 이용한 방법과 그냥 Pool함수를 이용하는 방법 2가지를 차례로 다뤄보았습니다.

 

먼저 multiprocessing을 이용하는 방법입니다. 하나하나의 process를 아래와 같이 별도로 만들어 주는 것입니다.

 

manager = multiprocessing.Manager()
return_dict = manager.dict()

p1 = multiprocessing.Process(target=함수명, args=(1,2,3,4,), kwargs={"a":1, "b":1})
p2 = multiprocessing.Process(target=함수명, args=(5,6,7,8,), kwargs={"a":3, "b":4})

p1.start()
p2.start()

p1.join()
p2.join()

if return_dict.get('p1', 0)==1 and return_dict.get('p2', 0)==1:
	pass

 

multiprocessing은 함수 입력인자와 키워드 입력인자를 직접 개별로 넣을 수 있습니다. start함수로 시작하고, join함수로 종료됐는지 확인합니다. return_dict에는 실행결과가 들어갑니다. prcess명을 지정할 수도 있는데 지정하지 않으면 p1, p2가 되는 것으로 알고 있습니다.

 

 

3. 함수 입력인자가 여러 개여도 Pool을 이용하는 방법

multiprocessing을 이용하는 것은 아무래도 복잡합니다. 그보다는 이렇게 작성하는 것이 편리한데요. 함수를 작성할 때 입력변수가 하나인 함수로 작성합니다. 그리고 입력변수를 튜플로 넣어서 여러 개의 변수를 처리할 수 있게 합니다. 혹은 딕셔너리나 리스트도 가능합니다. 아래와 같은 방법으로 하면 됩니다.

 

rls = p.map(함수명, [(1,2), (3,4)])

 

4. 병렬처리 진행바 확인하기

병렬 처리를 해도 시간이 오래 걸리는 경우, 진행바를 보고 싶을 때가 있습니다. 진행바를 보려면 조금 복잡한 작업을 해야 하는데 이를 편리하게 볼 수 있는 방법이 있습니다. 바로 parmap이라는 패키지를 이용하는 것인데요. 패키지를 설치하고, map함수를 이용하면 진행바를 쉽게 확인할 수 있습니다.

 

import parmap

rsl = parmap.map(ran_int, [1,2,3,4], pm_pbar=True, pm_processes='사용할 CPU코어수')

 

파이썬 multiprocessing를 이용해서 병렬로 처리하는 방법을 알아보았습니다. 병렬로 처리하면 무조건 속도가 빨라질 것 같지만, 그렇지 않은 경우도 있습니다. 하지만 쉽게 구현이 가능하기 때문에, 시간이 오래 걸리는 작업이 있다면 한 번 시도해 보시기 바랍니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기