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

 

파이썬 멀티프로세싱

 

 

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가 되는 것으로 알고 있다.


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

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


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

import parmap

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



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

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

댓글을 달아 주세요

">