我是第一次设置多处理模块,基本上,我打算按照
的方式做一些事情。from multiprocessing import pool
pool = Pool(processes=102)
results = pool.map(whateverFunction, myIterable)
print 1
根据我的理解,只要所有进程返回并且结果完成,就会打印1
。我想对这些进行一些状态更新。实现这一目标的最佳方式是什么?
我对制作whateverFunction()
印刷品犹豫不决。特别是如果有大约200个值,我会做一些类似于'过程完成的事情'印刷200次,这不是很有用。
我希望输出像
10% of myIterable done
20% of myIterable done
答案 0 :(得分:4)
pool.map
阻塞,直到所有并发函数调用完成。
pool.apply_async
不会阻止。此外,您可以使用其callback
参数
报告进展情况。每次log_result
完成时,都会调用一次回调函数foo
。它传递foo
返回的值。
from __future__ import division
import multiprocessing as mp
import time
def foo(x):
time.sleep(0.1)
return x
def log_result(retval):
results.append(retval)
if len(results) % (len(data)//10) == 0:
print('{:.0%} done'.format(len(results)/len(data)))
if __name__ == '__main__':
pool = mp.Pool()
results = []
data = range(200)
for item in data:
pool.apply_async(foo, args=[item], callback=log_result)
pool.close()
pool.join()
print(results)
产量
10% done
20% done
30% done
40% done
50% done
60% done
70% done
80% done
90% done
100% done
[0, 1, 2, 3, ..., 197, 198, 199]
上面的log_result
函数修改了全局变量results
和
访问全局变量data
。您无法将这些变量传递给
log_result
因为pool.apply_async
中指定的回调函数是。{
总是只用一个参数调用,foo
的返回值。
log_result
取决于:
from __future__ import division
import multiprocessing as mp
import time
def foo(x):
time.sleep(0.1)
return x
def make_log_result(results, len_data):
def log_result(retval):
results.append(retval)
if len(results) % (len_data//10) == 0:
print('{:.0%} done'.format(len(results)/len_data))
return log_result
if __name__ == '__main__':
pool = mp.Pool()
results = []
data = range(200)
for item in data:
pool.apply_async(foo, args=[item], callback=make_log_result(results, len(data)))
pool.close()
pool.join()
print(results)