Pythonのmultiprocessing.Pool
を使用すると、map
という奇妙な動作があります。下の例では、4つのプロセッサのプールが28のタスクで動作します。これは、それぞれ4秒かかる7回のパスを取る必要があります。最後のプロセスのpythonマルチプロセッシングマップの誤った取り扱い
ただし、8回かかります。最初の6回のパスでは、すべてのプロセッサが使用されます。 7回目のパスでは、2つのタスク(2つのアイドリング・プロセッサー)のみが完了します。残りの2つのタスクは8番目のパスで終了します(2つのアイドリングプロセッサー、もう一度)。この動作は、cpusの数とタスクの数が一見無作為に組み合わされ、不必要に時間が失われた場合に表示されます。
この例は、Intel Xeon Haswell(20コア)とIntel i7(4コア)の両方で再現されています。
Pool
をすべてのパスで使用可能なすべてのプロセッサを使用するように強制する方法はありますか?
import time
import multiprocessing
from multiprocessing import Pool
import datetime
def f(values):
now = str(datetime.datetime.now())
proc_id = str(multiprocessing.current_process())
print(proc_id+' '+now)
a=values**2
time.sleep(4)
return a
if __name__ == '__main__':
p = Pool(4) #number of processes
processed_values= p.map(f, range(28))
p.close()
p.join()
print processed_values
実行の出力は、これは明確か正しい答えを持っていない、次の質問に関連している
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:08:49.604065
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:08:49.604189
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:08:49.604252
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:08:49.604866
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:08:53.608475
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:08:53.608878
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:08:53.608931
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:08:53.609503
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:08:57.612831
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:08:57.613135
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:08:57.613555
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:08:57.614065
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:09:01.616974
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:09:01.617273
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:09:01.617699
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:09:01.618190
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:09:05.621284
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:09:05.621489
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:09:05.622130
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:09:05.622404
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:09:09.625522
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:09:09.625631
<Process(PoolWorker-3, started daemon)> 2016-05-13 17:09:09.626555
<Process(PoolWorker-4, started daemon)> 2016-05-13 17:09:09.626566
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:09:13.629761
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:09:13.629846
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:09:17.634003
<Process(PoolWorker-2, started daemon)> 2016-05-13 17:09:17.634317
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729]
以下の通りです。 Python: Multiprocessing Map takes longer to complete last few processes
特有!使用しているPythonのバージョンとOSを特定する必要があります。興味深い:あなたが私のボックスに書いているものを見ていますが、 'range(32)'や 'range(24)'に変更しても、それはちょっと困っています;-) –
@dano:素晴らしい回答! – Luis