gpt4 book ai didi

python - `multiprocessing` `starmap_async` 只调用回调一次?

转载 作者:行者123 更新时间:2023-12-01 07:57:47 29 4
gpt4 key购买 nike

我有以下代码,它为 4 个工作线程创建一个池,并调用一个工作线程方法。该代码在大多数情况下都可以正常工作。运行时,我看到不同的工作人员被调用来处理工作。然而,当所有工作人员完成时,calc_completed 永远不会在最后调用一次。这是预期的行为吗?我预计回调会在每个工作人员完成时发生。

def calculate_worker(x, y):
print 'working...'
...

def calc_completed(result):
print 'completed: %s'%str(result)

def calc_errored(result):
print 'error: %s'%str(result)

if __name__ == '__main__':
start, stop, step = 1, 1000, 1
ranges = [(n, min(n+step, stop)) for n in xrange(start, stop, step)]

pool = mp.Pool(processes=8)

res = pool.starmap_async(calculate_worker, ranges,
callback=calculate_worker, error_callback=calc_completed)

pool.close()
pool.join()
d = res.get()
print(d)

最佳答案

calc_completed 仅在执行映射函数(此处:calculate_worker)时遇到任何错误时才会被调用。

代码中的另一个问题是您并行运行 calculate_worker 函数并将其用作回调。这没有多大意义,因为 calculate_worker 将被调用两次 - 第一次:作为 worker 函数,第二次:作为报告计算已完成的函数。你应该有两个不同的功能。

鉴于您提供的代码片段中的功能,我将按以下方式更改它:

res = pool.starmap_async(calculate_worker, ranges,
callback=calc_completed,
error_callback=calc_errored)

如果您想测试 calc_errored 是否被正确调用,那么您可以在 calculate_worker 函数中引入一些随机错误来查看它是否会被处理,例如

def calculate_worker(x, y):
if (x % 7):
x / (y - y) # division by zero
print 'working...'

关于python - `multiprocessing` `starmap_async` 只调用回调一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55877510/

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