注意多处理完成

时间:2014-05-08 06:51:19

标签: python multiprocessing

此处的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'

1 个答案:

答案 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更改,如字典。