2014-10-07 70 views
7

我希望总体上说明我们当前的通话量。我在耕种,希望了解当前的进展情况。因此,如果我将100作业发送到10处理器,我如何显示当前返回的作业数量是多少。我可以得到这个ID,但是如何从我的地图函数中算出已完成的返回作业的数量。计算执行期间在多处理执行任务中执行的任务总数

我打电话给我的功能如下:

op_list = pool.map(PPMDR_star, list(varg)) 

而在我的功能,我可以打印当前名称

current = multiprocessing.current_process() 
print 'Running: ', current.name, current._identity 
+0

您希望能够从每个工作进程中检查此问题吗? – dano 2014-10-07 14:47:47

+0

@dano - 我不介意 - 只是进程正在执行中。 Pool.map直到完成才会返回,所以到那时为止的任何统计信息 - 还是有办法? – disruptive 2014-10-07 14:55:01

回答

13

如果使用pool.map_async可以拉这个信息出来的MapResult返回的实例。例如:

import multiprocessing 
import time 

def worker(i): 
    time.sleep(i) 
    return i 


if __name__ == "__main__": 
    pool = multiprocessing.Pool() 
    result = pool.map_async(worker, range(15)) 
    while not result.ready(): 
     print("num left: {}".format(result._number_left)) 
     time.sleep(1) 
    real_result = result.get() 
    pool.close() 
    pool.join() 

输出:

num left: 15 
num left: 14 
num left: 13 
num left: 12 
num left: 11 
num left: 10 
num left: 9 
num left: 9 
num left: 8 
num left: 8 
num left: 7 
num left: 7 
num left: 6 
num left: 6 
num left: 6 
num left: 5 
num left: 5 
num left: 5 
num left: 4 
num left: 4 
num left: 4 
num left: 3 
num left: 3 
num left: 3 
num left: 2 
num left: 2 
num left: 2 
num left: 2 
num left: 1 
num left: 1 
num left: 1 
num left: 1 

multiprocessing内部打破你传递给map成块的迭代,并将每个块的子进程。因此,_number_left属性确实保留剩余的块的数量,而不是可迭代中的单个元素。请记住,如果您在使用大型迭代时看到奇怪的数字。它使用分块来提高IPC性能,但如果看到完整结果的准确记录对您而言比添加的性能更重要,则可以使用chunksize=1关键字参数至map_async以使_num_left更加准确。 (chunksize通常只会对非常大的迭代产生显着的性能差异,请亲自尝试一下,看看它是否对您的用例非常重要)。

正如你在评论中提到的,因为pool.map阻止,你不能真正得到这个,除非你要启动做了投票,而挡在map调用主线程在后台线程,但我不通过上述方法确实有这样做的好处。

要记住的另一件事是,您使用的是MapResult的内部属性,所以有可能在未来的Python版本中可能会中断该属性。

+0

谢谢。我试着用map_async运行,但遇到了一个问题:'MapResult'对象不可迭代 – disruptive 2014-10-07 15:05:59

+1

@Navonod我已经更新了我的答案。您需要在MapResult实例上调用'result.get()'来获得实际的结果列表。 – dano 2014-10-07 15:07:22

+0

我注意到一个问题似乎有很多工作要映射 - 因为我的数字是不正确的。我派出了8k个工作 - 是很多文件,但我收到奇怪的报告。 I.e:找到#个文件8067 要处理的文件数量:253 – disruptive 2014-10-07 15:28:10