Python队列。空非空的例外多处理.Queu

2024-04-25 14:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了许多Python用户的相反问题——我的程序使用的CPU太少。我在切换到多处理来利用我工作的计算机的四个核心时,看到了真正的性能改进。但这种改进有些不可靠。我的程序的CPU使用率似乎随着它的继续运行而恶化——即使有六个进程在运行。在添加了一些调试消息之后,我发现这是因为我正在生成的一些进程(它们都应该运行到完成之前)过早地死亡。进程运行的方法的主体是while True循环,唯一的出路是这个块:

try:
    f = filequeue.get(False)
except Empty:
    print "Done"
    return

filequeue是在创建子流程之前填充的,因此它实际上并不为空。所有进程应该在大致相同的时间退出,一旦它实际上是空的。我尝试在队列.get打电话,但这没能解决问题。为什么我会得到队列.empty来自非空队列的异常?在


Tags: 方法用户程序消息利用核心get队列
2条回答

我也遇到过类似的问题,并且通过实验(而不是阅读文档)发现,即使队列不是空的,get(False)仍然可以错误地抛出empty。在我的用例中,当队列中的工作用完时,工人必须退出,因此get(True)是一个非选项。在

我的解决方案是这样的:我发现,如果在“except Empty:”块中,我检查队列是否确实是Empty(),那么它的works Empty()将不会返回True,除非队列真的是空的。在

我使用的是python2.7。在

我建议使用filequeue.get(True)而不是filequeue.get(False)。这将导致队列阻塞,直到有更多的元素。在

但是,在处理完最后一个元素之后,它将永远阻塞。在

为了解决这个问题,主进程可以在每个队列的末尾添加一个特殊的“sentinel”对象。工人将在看到这个特殊对象时终止(而不是依赖于队列的空性)。在

相关问题 更多 >