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版本中可能会出现这种情况.
| 归档时间: |
|
| 查看次数: |
7644 次 |
| 最近记录: |