如果使用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版本中可能会中断该属性。
您希望能够从每个工作进程中检查此问题吗? – dano 2014-10-07 14:47:47
@dano - 我不介意 - 只是进程正在执行中。 Pool.map直到完成才会返回,所以到那时为止的任何统计信息 - 还是有办法? – disruptive 2014-10-07 14:55:01