39の作品のプールに1つのペアを送信しているので、2番目のコード例は遅いです。あなたのリクエストを処理しているワーカーは1人で、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)'と 'pool:'に変更し、プールを使用するその下の行をインデントしてください。ブロックが終了すると、作業者はすぐにクリーンアップされます。 – ShadowRanger