此处的poolDict
字典用于编写有关multiprocessing
Pool()开始的进程的一些更新。 while loop
正在后台运行,它正在监视poolDict发生的任何更新。一旦条件满足len(poolDict)==3
,循环就会停止。
下面的代码运行正常。但是,使用此处概述的相同方法的真实世界程序会引入一些奇怪的行为。例如while loop
即使在满足条件后也不想停止运行。 while
循环至少需要15秒才能最终“实现”len(poolDict)已经等于3.它会导致需要修复的明显时滞。而不是while
循环还有什么可以用作替代?采取什么方法才能立即进行更新?
import time
import multiprocessing as mp
poolDict=mp.Manager().dict()
def myFunction(arg):
print '\n\tprocessing arg', arg, '...'
for i in range(arg+1):
if i==arg:
poolDict[arg]=True
print '\n\t\t...processing completed for', arg
pool=mp.Pool(processes=2)
pool.map_async( myFunction, [15000001,15000002,15000003] )
status=True
while status:
print status
time.sleep(.2)
if len(poolDict)==3:
status=False
print '...while loop was stopped'
print 'completed'
答案 0 :(得分:1)
为什么不使用map_async的返回值?
result=pool.map_async(myFunction, ...)
result.wait()
由于字典本身会破坏值的顺序,我实际上会考虑使用imap_unordered来传输所有值,例如:
def myFunction(arg):
# time consuming stuff...
return arg, True
nonpooldict = dict(pool.imap_unordered(myFunction, data))
# Will collect results in a dictionary as they are calculated
否则您可能想尝试SyncManager.Event等同步方法。我不确定是否有办法刷新特定类型的SyncManager更改,如字典。