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

dis*_*ive 9 python parallel-processing multiprocessing

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

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

op_list = pool.map(PPMDR_star, list(varg))
Run Code Online (Sandbox Code Playgroud)

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

current = multiprocessing.current_process()
print 'Running: ', current.name, current._identity
Run Code Online (Sandbox Code Playgroud)

dan*_*ano 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()
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

multiprocessing在内部中断您传递给map块的迭代,并将每个块传递给子进程.因此,该_number_left属性实际上跟踪剩余的数,而不是可迭代中的各个元素.如果您在使用大型迭代时看到奇怪的数字,请记住这一点.它采用分块,以提高IPC性能,但如果看到完成结果的准确理货是你比增加的性能更重要的是,你可以使用chunksize=1关键字argumment来map_async作出_num_left更准确.(chunksize对于非常大的迭代,通常只会产生显着的性能差异.请自行尝试,看看它是否真的与您的用例有关).

正如你在评论中提到的那样,因为pool.map是阻塞,你不能真正得到这个,除非你在主要线程在map通话中被阻止时启动一个后台线程进行轮询,但我不确定做什么有什么好处通过上述方法.

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

  • 谢谢。我尝试仅使用map_async运行,但是遇到了一个问题:“ MapResult”对象不可迭代 (2认同)
  • @Navonod我已经更新了答案。您需要在“ MapResult”实例上调用“ result.get()”以获取实际的结果列表。 (2认同)