Python 多处理池:显示准备好的未处理结果的数量

Python 多处理池:显示准备好的未处理结果的数量,python,multiprocessing,Python,Multiprocessing,使用python的multiprocessing.Pool和imap_unordered我将一长串缓慢的任务排队给池中的一组工作人员。通过迭代result对象,我能够在结果准备就绪时处理它们,而不管它们的提交顺序如何,在这里我执行一个额外的逻辑块,该逻辑块不能并行化并包含在imap_unordered的func中 我希望能够列出有多少任务已经“完成”(akafunc执行并返回)并准备就绪,但尚未迭代 考虑以下伪代码: def exp_func(i): time.sleep(i)

使用python的
multiprocessing.Pool
imap_unordered
我将一长串缓慢的任务排队给池中的一组工作人员。通过迭代result对象,我能够在结果准备就绪时处理它们,而不管它们的提交顺序如何,在这里我执行一个额外的逻辑块,该逻辑块不能并行化并包含在
imap_unordered
func

我希望能够列出有多少任务已经“完成”(aka
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\u unparalleble
需要一个固定的时间,因此在总体方案中,它预计是无关紧要的,但在高峰时间或在一系列相对快速的
exp\u func
调用之后(在
exp\u func
的初始执行中也是如此)有一个预期的积压任务,
exp_func
已完成执行,但尚未迭代

为了尽可能清楚地说明这一点,以下是自执行以来给定时间的预期输出:

我希望在
t==1时有以下输出:

func 1
完成1
就绪0
然后在
t==9
时,附加输出:

func 2
职能3
职能4
职能5
职能6
职能7
职能8
职能9
最后,在
t==11
处,将额外打印以下内容:

func 10
完成2
准备好了吗

您感兴趣的信息没有公共界面

在您的情况下,
imap\u unordered
将返回一个
imapunordereditor
,但不保证此返回类型。在某些情况下,会返回一个生成器(文档中除了迭代器之外什么也没有承诺)

在返回
imapunOrderEditor
的情况下,私有属性
\u items
包含所有可用但尚未迭代的元素。因此,访问这个私有属性,您可以检查
len(result\u iter.\u items)
以找到您想要的信息(显然,它最多只能在检查的瞬间正确,因为池可能随时添加新的结果,但这可能对您仍然有用)


您可能想考虑为多进程库提供一个补丁,在公共接口下公开这个信息。如何开始向多处理库贡献代码的旅程?在bugs.python.org上提交一个问题,描述您想要什么以及为什么要这样做,并向python开发人员发表文章,指出这个问题,试图引起大家的兴趣,如果您没有得到任何反馈,说这是一个永远不可能被接受的更改,请查看。