首页 > 解决方案 > Python多处理-starmap_async在starmap的地方不起作用?

问题描述

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版本不需要但版本需要吗?真正令人困惑的是,在某些情况下版本是必要的(如上所述),但在其他情况下版本是不必要的,除了通过实验之外,我无法确定如何/为什么/何时需要。mapstarmap.get()asyncasync.get()async.get().get()

标签: pythonmultiprocessing

解决方案


您无需等待通过调用获得的未来.starmap_async()的结果,或者执行任何其他会阻止MainProcess在安排作业后立即退出的事情。

pool.starmap_async(printSum, params).wait()会这样做,但在这里毫无意义。异步变体仅在您需要解除阻塞调用线程以同时执行其他操作时才有意义。


推荐阅读