多处理池:显示已处理的未处理结果的数量

时间:2018-03-07 02:18:21

标签: python multiprocessing

使用python' s multiprocessing.Poolimap_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_funcexp_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

1 个答案:

答案 0 :(得分:1)

您对自己感兴趣的信息没有公开界面。

在您的情况下,imap_unordered将返回IMapUnorderedIterator,但不保证此返回类型。在某些情况下,会返回一个生成器(并且文档承诺除了迭代器之外)。

在返回IMapUnorderedIterator的情况下,私有属性_items包含所有可用但尚未迭代的元素。因此,访问此私有属性,您可以检查len(result_iter._items)以查找所需的信息(显然,在检查时它最多只是正确的,因为池可能随时添加新结果,但可能是&#39 ; s对你仍然有用)。

您可能需要考虑为多处理库提供补丁,该补丁在公共接口下公开此信息。