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

时间:2019-04-27 05:22:07

标签: python

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

1 个答案:

答案 0 :(得分:0)

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

代码中的另一个问题是您同时并行运行calculate_worker函数并将其用作callback 。这没有多大意义,因为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...'