두 번째 코드 예는 한 쌍을 39 개의 작품으로 구성된 풀에 제출하기 때문에 속도가 느립니다. 한 명의 작업자 만 귀하의 요청을 처리하고 나머지 38 명은 아무 것도하지 않습니다! 주 스레드에서 작업자 프로세스로 데이터를 파이프하는 데 오버 헤드가 있으므로 느려질 것입니다.
일부 쌍을 "버퍼링"한 다음 쌍을 실행하여 메모리 사용량의 균형을 조정할 수 있지만 여전히 다중 프로세스 환경을 이용할 수 있습니다.
import itertools
from multiprocessing import Pool
def foo(x):
return sum(x)
cpus = 3
pool = Pool(cpus)
# 10 is buffer size multiplier - the number of pair that each process will get
buff_size = 10*cpus
buff = []
for i, r in enumerate(itertools.product(range(20), range(10))):
if (i % buff_size) == (buff_size-1):
print pool.map(foo, buff)
buff = []
else:
buff.append(r)
if len(buff) > 0:
print pool.map(foo, buff)
buff = []
위의 출력은 시스템에 대한 균형을 얻기 위해 buff_size
승수와이
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 8, 9, 10, 11, 12, 13, 14, 15, 16]
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 14, 15, 16, 17, 18, 19, 20, 21, 22]
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 17, 18, 19, 20, 21, 22, 23, 24, 25]
[18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
플레이처럼 보이는 것!
사이드 노트 : 현대 Python (Python 3.3 이상)을 사용하는 경우'Pool'을'with' 문과 함께 사용하는 것이 가장 좋으므로'Pool' 작업자는 예상대로 정리됩니다. 단지'pool = Pool (39)'를'Pool (39) as pool :'으로 변경하고 풀을 사용하는 그 아래의 줄을 들여 쓰기하십시오. 블록이 종료되면 작업자는 즉시 정리됩니다. – ShadowRanger