我遇到了许多Python用户的相反问题——我的程序使用的CPU太少。我在切换到多处理来利用我工作的计算机的四个核心时,看到了真正的性能改进。但这种改进有些不可靠。我的程序的CPU使用率似乎随着它的继续运行而恶化——即使有六个进程在运行。在添加了一些调试消息之后,我发现这是因为我正在生成的一些进程(它们都应该运行到完成之前)过早地死亡。进程运行的方法的主体是while True循环,唯一的出路是这个块:
try:
f = filequeue.get(False)
except Empty:
print "Done"
return
filequeue是在创建子流程之前填充的,因此它实际上并不为空。所有进程应该在大致相同的时间退出,一旦它实际上是空的。我尝试在队列.get打电话,但这没能解决问题。为什么我会得到队列.empty来自非空队列的异常?在
我也遇到过类似的问题,并且通过实验(而不是阅读文档)发现,即使队列不是空的,get(False)仍然可以错误地抛出empty。在我的用例中,当队列中的工作用完时,工人必须退出,因此get(True)是一个非选项。在
我的解决方案是这样的:我发现,如果在“except Empty:”块中,我检查队列是否确实是Empty(),那么它的works Empty()将不会返回True,除非队列真的是空的。在
我使用的是python2.7。在
我建议使用
filequeue.get(True)
而不是filequeue.get(False)
。这将导致队列阻塞,直到有更多的元素。在但是,在处理完最后一个元素之后,它将永远阻塞。在
为了解决这个问题,主进程可以在每个队列的末尾添加一个特殊的“sentinel”对象。工人将在看到这个特殊对象时终止(而不是依赖于队列的空性)。在
相关问题 更多 >
编程相关推荐