2017-10-18 51 views
2

如果我理解正確,apply_async會立即返回一個AsyncResult對象。如果我按照以下方式收集這些對象,並且只有在所有工作人員完成後才使用get(),那麼可以安全地假定這些值將按照該函數的調用順序嗎?apply_async結果順序

objRes = [None] * len(aRange) 
pool = Pool(processes=8) 
for x in aRange: 
    objRes[x] = pool.apply_async(f,(arg1, arg2, arg3,)) 
pool.close() 
pool.join() 

res = [None] * len(aRange) 
for x in aRange: 
    res[x] = objRes[x].get() 

我開始嘗試使用pool.map()和pool.starmap()來代替,但我有兩個數組作爲參數部分,無法弄清楚究竟是如何通過他們。

回答

1

apply_async函數返回的AsyncResult對象與您計劃的元組函數參數相關聯。

因此,當您撥打AsyncResult.get時,您將得到該給定工作的結果。

如果您將AsyncResult對象放在與您計劃作業的順序相同的列表中,那麼您將按照該順序得到結果。

map函數的內部工作方式與您的示例非常類似。如果您想將多於一個參數傳遞給預定的函數,則需要將其與其餘參數進行分組。如果你有很多爭論,它可能會消耗很多內存。

arg_list = ((arg1, arg2, arg3) for _ in aRange) 

pool.map(f, arg_list)