【发布时间】:2017-10-21 17:20:51
【问题描述】:
我正在使用 Python 的多处理模块来进行科学并行处理。在我的代码中,我使用了几个执行繁重工作的工作进程和一个将结果保存到磁盘的写入器进程。要写入的数据通过队列从工作进程发送到写入进程。数据本身相当简单,仅由一个包含文件名的元组和一个带有两个浮点数的列表组成。经过几个小时的处理,编写器进程通常会卡住。更准确地说是下面的代码块
while (True):
try:
item = queue.get(timeout=60)
break
except Exception as error:
logging.info("Writer: Timeout occurred {}".format(str(error)))
永远不会退出循环,我会收到连续的“超时”消息。
我还实现了一个日志记录过程,它输出队列的状态等,即使我收到上面的超时错误消息,对 qsize() 的调用也会不断返回一个完整的队列(在我的情况下大小 = 48 )。
我已彻底检查了有关队列对象的文档,但找不到可能的解释为什么 get() 在队列满时返回超时。
有什么想法吗?
编辑:
我修改了代码以确保捕获到空队列异常:
while (True):
try:
item = queue.get(timeout=60)
break
except Empty as error:
logging.info("Writer: Timeout occurred {}".format(str(error)))
【问题讨论】:
-
我也有同样的问题。但是,如果队列仍然满了并且它通常可以工作,我通过在超时后重试 .get() 来回避这个问题,但这并不是真正的解决方案。你找到解决办法了吗?
标签: python multiprocessing python-multiprocessing