gpt4 book ai didi

python - 如何跟踪多处理和 pool.map 的状态?

转载 作者:太空狗 更新时间:2023-10-30 02:58:12 25 4
gpt4 key购买 nike

我是第一次设置多处理模块,基本上,我打算按照以下方式做一些事情

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

最佳答案

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)

关于python - 如何跟踪多处理和 pool.map 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34827250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com