计算执行期间多处理.Pool中执行的任务总数

时间:2014-10-07 14:42:01

标签: python parallel-processing multiprocessing

我想总体上说明我们当前的谈话。我正在耕种工作,想知道目前的进展。因此,如果我将100个作业发送到10处理器,我该如何显示返回的当前作业数是多少。我可以获取id但是如何从我的map函数中计算已完成的返回作业的数量。

我正在调用我的函数如下:

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

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

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

1 个答案:

答案 0 :(得分:17)

如果您使用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关键字argumment map_async_num_left } 更准确的。 (chunksize通常只会对非常大的迭代产生明显的性能差异。请亲自尝试一下,看看它对你的用例是否真的重要。)

正如您在评论中提到的那样,因为pool.map是阻塞的,除非您在map中阻止主线程时启动后台线程进行轮询,否则无法实现此目的打电话,但我不确定通过上述方法做到这一点有什么好处。

要记住的另一件事是您正在使用MapResult的内部属性,因此在未来的Python版本中可能会出现这种情况。