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

标签 python python-2.7 python-multiprocessing

我有以下代码,它为 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/

相关文章:

python-2.7 - SQLAlchemy 事务中的错误不会返回正确的回溯(Python 2.7)

Python 多处理 - AssertionError : can only join a child process

Python:(悲情)多处理与类方法

python - 如何从 finviz.com 获取和分析历史市场数据

Python 井字游戏错误 : TypeError: 'function' object is not subscriptable

python-2.7 - Ubuntu 上的 PyOpenGL for Python 2.7

python - Gurobi 的多处理兼容性问题

python - 在 Python 的 Paramiko 中强制进行密码验证(忽略 .ssh 文件夹中的 key )

Python 嵌套字典理解返回空字典

Python - 如何通过 HTTP 代理使用(Urllib2 + SSL)处理 HTTPS 请求