如果我理解正确,apply_async会立即返回AsyncResult对象。如果我按以下方式收集这些对象,并且只在所有工作者完成后才使用get(),是否可以安全地假设值将按函数调用的顺序进行?
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(),但我有两个数组作为参数的一部分,无法弄清楚如何准确传递它们。
答案 0 :(得分:1)
AsyncResult
函数返回的apply_async
对象与您安排的元组函数参数相关联。
因此,当您致电AsyncResult.get
时,您将获得该给定工作的结果。
如果您将AsyncResult
个对象放在一个列表中,其顺序与您安排的作业相同,那么您将按顺序获得结果。
map
函数内部的工作方式与您的示例非常相似。如果要将多个参数传递给调度函数,则需要将其与其余参数分组。如果你有很多争论,那可能会耗费内存。
arg_list = ((arg1, arg2, arg3) for _ in aRange)
pool.map(f, arg_list)