使用python' s multiprocessing.Pool
和imap_unordered
我将一长串缓慢的任务排入池中的一组工作人员。迭代结果对象,我能够处理结果,因为它们已经准备就绪,无论它们的提交顺序如何,我执行了另外一块逻辑,这些逻辑无法并行化并包含在imap_unordered
' s中func
。
我希望能够列出已经完成了多少任务"完成" (又名func
已执行并返回)已准备好,但尚未迭代过。
考虑这个伪代码:
def exp_func(i):
time.sleep(i)
print("func", i)
def fun_unparallelable(i):
print("fun_unparallelable", i)
time.sleep(10)
p = multiprocessing.Pool(processes=10)
result_iter = p.imap_unordered(exp_func, range(1000))
done = 0
for result in result_iter:
done += 1
print("done", done)
print("ready", get_pool_ready(...))
fun_unparallelable(i)
由于fun_unparallelable
需要一个恒定的时间,因此预计在宏观方案中是微不足道的,但是在高峰时间或在一长串相对较快的exp_func
调用之后(如同在初始执行exp_func
)exp_func
已完成执行但尚未迭代的预期积压任务。
为了尽可能清楚,这里是执行后给定时间的预期输出:
我希望t == 1
处有以下输出:
func 1
done 1
ready 0
然后在t == 9
,附加输出:
func 2
func 3
func 4
func 5
func 6
func 7
func 8
func 9
最后在t == 11
,将另外打印以下内容:
func 10
done 2
ready 8
答案 0 :(得分:1)
您对自己感兴趣的信息没有公开界面。
在您的情况下,imap_unordered
将返回IMapUnorderedIterator
,但不保证此返回类型。在某些情况下,会返回一个生成器(并且文档承诺除了迭代器之外)。
在返回IMapUnorderedIterator
的情况下,私有属性_items
包含所有可用但尚未迭代的元素。因此,访问此私有属性,您可以检查len(result_iter._items)
以查找所需的信息(显然,在检查时它最多只是正确的,因为池可能随时添加新结果,但可能是&#39 ; s对你仍然有用)。
您可能需要考虑为多处理库提供补丁,该补丁在公共接口下公开此信息。