2017-10-18 135 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)