我想总体上说明我们当前的谈话。我正在耕种工作,想知道目前的进展。因此,如果我将100
个作业发送到10
处理器,我该如何显示返回的当前作业数是多少。我可以获取id但是如何从我的map函数中计算已完成的返回作业的数量。
我正在调用我的函数如下:
op_list = pool.map(PPMDR_star, list(varg))
在我的功能中,我可以打印当前名称
current = multiprocessing.current_process()
print 'Running: ', current.name, current._identity
答案 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版本中可能会出现这种情况。