Python 计算执行期间在多处理池中执行的任务总数

Python 计算执行期间在多处理池中执行的任务总数,python,parallel-processing,multiprocessing,Python,Parallel Processing,Multiprocessing,我想对目前的谈话做一个总体上的说明,我们只是。我在做农活,想知道目前的进展。因此,如果我将100作业发送到10处理器,我如何显示当前返回的作业数。我可以获取id,但是如何从映射函数中计算已完成的返回作业的数量呢 我按如下方式调用我的函数: op_list = pool.map(PPMDR_star, list(varg)) 在我的函数中,我可以打印当前名称 current = multiprocessing.current_process() print 'Running: ', curren

我想对目前的谈话做一个总体上的说明,我们只是。我在做农活,想知道目前的进展。因此,如果我将
100
作业发送到
10
处理器,我如何显示当前返回的作业数。我可以获取id,但是如何从映射函数中计算已完成的返回作业的数量呢

我按如下方式调用我的函数:

op_list = pool.map(PPMDR_star, list(varg))
在我的函数中,我可以打印当前名称

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

如果使用
pool.map\u async
可以从返回的实例中提取此信息。例如:

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
的iterable分解为块,并将每个块传递给子进程。因此,
\u number\u left
属性实际上跟踪剩余的块数,而不是iterable中的单个元素。如果你在使用大型iterables时看到奇数,请记住这一点。它使用分块来提高IPC性能,但如果查看已完成结果的准确计数比增加的性能更重要,则可以使用
chunksize=1
关键字参数来
map\u async
使
\u num\u left
更准确。(chunksize通常只会对非常大的iterables产生明显的性能差异。请自己尝试一下,看看它是否真的与您的用例有关)

正如您在评论中提到的,因为
pool.map
正在阻塞,除非您启动一个后台线程进行轮询,而主线程在
map
调用中被阻塞,否则无法真正实现这一点,但我不确定这样做是否有任何好处


要记住的另一件事是,您使用的是
mapreult
的内部属性,因此这可能会在Python的未来版本中中断。

您希望能够从每个工作进程中检查这一点吗?@dano-我不介意-只是在执行进程时进行检查。Pool.map在完成之前不会返回,所以到那时任何统计都为时已晚-或者有办法吗?谢谢。我尝试使用map_async运行,但遇到问题:“MapResult”对象不可用iterable@Navonod我已经更新了我的答案。您需要在
MapResult
实例上调用
result.get()
,以获取实际的结果列表。我注意到一个问题,似乎有很多作业需要映射,因为我的数字不正确。我发送了8k份工作-是的,有很多文件,但我收到了奇怪的报告。即:找到#文件8067剩余处理的文件数:253@Navonod请参见示例输出后面的段落。您可以看到,这是因为
多处理
在内部执行分块。使用
map\u async(func,iterable,chunksize=1)
您应该会看到您期望的数字。抱歉隐藏在那里。现在一切正常!谢谢