这个starmap
示例程序按预期工作:
import multiprocessing
def main():
pool = multiprocessing.Pool(10)
params = [ (2, 2), (4, 4), (6, 6) ]
pool.starmap(printSum, params)
# end function
def printSum(num1, num2):
print('in printSum')
mySum = num1 + num2
print('num1 = ' + str(num1) + ', num2 = ' + str(num2) + ', sum = ' + str(mySum))
# end function
if __name__ == '__main__':
main()
输出:
in printSum
num1 = 2, num2 = 2, sum = 4
in printSum
num1 = 4, num2 = 4, sum = 8
in printSum
num1 = 6, num2 = 6, sum = 12
但是如果我像这样将starmap
行更改为starmap_async
:
pool.starmap_async(printSum, params)
并保持其他所有内容相同,我根本没有输出?!? 从阅读文档 https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool.map_async 我无法确定原因。 我已经在其他情况下成功地使用了starmap_async。 我在这里错过了什么??
---编辑---
我发现如果在上述工作程序中我更改了行
pool.starmap(printSum, params)
到以下两行:
result = pool.starmap_async(printSum, params)
result.get()
然后我得到了预期的结果,所以我想这至少解决了问题。 但是有人可以解释为什么.get()
对于非async
版本的map
/starmap
不是必需的,但对于async
版本是必需的.get()
? 真正令人困惑的是,对于async
版本,在某些情况下.get()
是必要的(如上所述(,但在其他情况下,对于async
版本,.get()
不是必需的,我无法确定如何/为什么/何时需要.get()
除了通过实验。
您不会等待将来通过调用.starmap_async()
获得的结果,也不会执行任何其他会阻止MainProcess
在调度作业后立即退出的操作。
pool.starmap_async(printSum, params).wait()
会这样做,但在这里毫无意义。仅当您需要同时取消阻止调用线程以执行其他操作时,异步变体才有意义。