2014-05-08 70 views
0

poolDict這裏的poolDict字典用於寫入以multiprocessing Pool()開始的進程的一些更新。 while loop正在後臺運行,它正在監視poolDict發生的任何更新。條件滿足時len(poolDict)==3 while循環停止。 下面的代碼運行良好。但是使用這裏概述的相同方法的真實世界程序引入了一些奇怪的行爲。例如,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

爲什麼不使用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更改。

+0

如果我使用'result = pool.map_async(myFunction,...) result.wait()'方法如何獲得myFunction()的返回值?它們是否全部存儲在'result'變量中?如何檢索由myFunction()值返回的? – alphanumeric