gpt4 book ai didi

Python 多处理 - starmap_async 在 starmap 工作的地方不起作用?

转载 作者:行者123 更新时间:2023-12-01 06:30:27 29 4
gpt4 key购买 nike

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

最佳答案

您无需等待 future 的结果您可以调用 .starmap_async(),或者执行任何其他操作来阻止 MainProcess 在安排作业后立即退出。

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

关于Python 多处理 - starmap_async 在 starmap 工作的地方不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59936012/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com