使用队列和侦听器登录到控制台时出现意外行为

问题描述 投票:0回答:2

我在我的项目中遇到了一些日志伏都。

阅读以下内容后:QueueHandler QueueListener

我在我的程序中设计了如下记录:在主进程中 - 使用QueueHandler分配的根记录器。该队列由QueueListener监听,其目标是普通的StreamHandler。我的程序在某个执行点,将分析任务发送到进程池。每个池进程都分配有在主进程的QueueHandler中创建的队列,因此它也可以将日志记录发送到控制台。

关于我的程序的注意事项 - 这是python 2程序,我手动从python 3向后移植了QueueHandler和QueueListener的代码。

我的程序执行中出现了一个不一致的问题(但主要是在它的测试中):程序卡住了,没有消息打印到控制台。如果StreamHandler与FileHandler交换 - 测试一致地传递。

这是我用于测试的环境:

解释器:PyPy 5.6.0,GCC 4.8.4

pytest版本:'3.2.3'

记录版本:'0.5.1.2'

uname -a:Linux ip-172-31-36-72 3.13.0-74-generic#118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux

我认为共享一个github仓库并不常见 - 但我将我的程序解压缩到一个非常小的项目中,问题再现(有时)。随意查看:log_voodoo

为什么会这样?有没有解决方案可以解决这个问题?

python logging message-queue pypy
2个回答
0
投票

你可以使用logutils项目,它将QueueHandler和QueueListener反向移植到Python 2.x.

您应该设置:

  • 主进程 - 仅配置QueueListener和StreamHandler
  • 工人 - 仅限QueueHandler

理想情况下,工作者应该自己创建和添加QueueHandler,而不是依赖于从主进程继承它(如果它们是从它分叉的)。伐木食谱有一个example setup(工作代码,AFAIK)。


0
投票

如果不深入研究代码,您可能想尝试使用PyPY 6.0,这两个版本之间存在一些问题。

© www.soinside.com 2019 - 2024. All rights reserved.