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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用队列和侦听器登录到控制台时出现意外行为相关的知识,希望对你有一定的参考价值。

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

阅读以下内容后: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

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

答案

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

您应该设置:

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

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

另一答案

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

以上是关于使用队列和侦听器登录到控制台时出现意外行为的主要内容,如果未能解决你的问题,请参考以下文章

将子视图添加到 UICollectionViewCell 时出现意外行为

添加到自定义 UICollectionViewCell 时出现意外的 CAShapeLayer 行为

pyspark:在同一列(使用数组)上使用多个 UDF 函数时出现意外行为

使用条件变量多线程时出现意外行为

display_timer_callback:滚动时出现意外状态

使用选项卡控制器时出现奇怪的滚动行为 - iOS