【问题标题】:On linux using Python 2.7 multiprocessing.Process and logging, how/why is logging sequential?在使用 Python 2.7 multiprocessing.Process 和日志记录的 Linux 上,日志记录如何/为什么是顺序的?
【发布时间】:2013-10-13 21:50:12
【问题描述】:

我有一个队列工作分解器,它通过自定义的 multiprocessing.Pool() 生成 15-25 个子进程。单个工作人员在不到 1000 毫秒的时间内以 10-15 条消息发出 1-3 条 logging.info 消息,我注意到时间戳始终是连续的,并且永远不会与其他消息发生冲突。这向我表明在多处理或日志记录中某处存在共享锁,但我无法确定它的确切位置。

这主要用于教育目的,因为相关软件将被重构为异步或多线程,因为 90% 的实时是在 IO 中(远程 api 而不是数字运算)。

日志配置反映了 Django 的配置,因为我喜欢它的组织方式:

LOGGING['handlers']['complex_console'] = {'level':'DEBUG', 
    'class':'logging.StreamHandler',         
    'formatter':'complex'
}

LOGGING['loggers']['REDACTED_sync'] = {
'handlers': ['complex_console'],
'propagate': True,
'level':'DEBUG'
}

快速澄清一下,multiprocessing.Process 确实使用了 fork,但在产生子进程之前不会调用 logging.getLogger()。

【问题讨论】:

  • 虽然我不认为它与记录器有关,但我已经多次使用多处理进行记录,总是使用同一个记录器,并且我确实收到来自不同进程的消息,它们相互交错。您可以尝试使用单个记录器实例(可能有帮助也可能没有帮助),或者发布您的生成代码以获得更好的外观。

标签: python linux logging multiprocessing


【解决方案1】:

我不知道你的生成器是如何工作的,但如果它遵循一个非常简单的架构:

logger = get_logger() # Gets logger instance)

class Foo:
    #Definition

while(True):
    #A loop that spawns processes

然后它们将共享相同的记录器实例,因此您会获得“顺序”写入。它不会强加任何您会注意到性能方​​面的锁定。这是出于一个非常简单的原因 - 将日志附加到文件非常快,并且几乎总是在再次需要该文件之前完成。

您可以进行实验并从日志记录中删除文件处理程序,您会注意到它们仍然是连续的,因为两个进程(即使执行完全相同)同时完成的情况非常罕见。

【讨论】:

  • 调试/信息发射将在 500 毫秒内以 5 到 10 条消息的任何位置发送到标准输出,持续约 4 小时,但我什至还没有看到一条线被破坏。日志配置在分叉前完成,但大多数 getLoger 调用是在 POpen 分叉之后完成的。
  • 我认为我不明白您的实际问题是什么,时间戳是连续的?如果是,那么它按预期工作,我不明白你为什么不期望它?日志中显示的时间戳是一个时间戳 logging.info() 调用,它还锁定日志文件并写入它。这就是它的实现方式,这就是时间戳是顺序的原因。
  • 我担心的是logging.StreamHandler 以某种方式保持所有分叉子进程调用的顺序,这表明某处有锁。我已将 \b 和 \e 字符放入格式化程序中,以查看是否不止一次在一行上或丢失,对于通过 python my_program.py | tee log_file.py 将 20K 日志条目输出到标准输出的循环来说运气不佳
  • @David 你没有向我们展示代码,你希望我们调试它?这很可能是您设计它的工作方式,不能说没有代码,而且您似乎非常不愿意展示它。我已经向你解释了锁定 logger 的工作原理,这不是你关心的问题。
【解决方案2】:

如果您只有一个处理器,那么您得到的行为应该是预期的。

【讨论】:

  • 抱歉,重新检查,问题机器至少有 4 个逻辑核心,虽然它是 AWS,所以这可能意义不大。实例类型具体为 m1.xlarge。
  • 这与处理器甚至线程的数量无关,因为即使在 1 个逻辑线程上也可以进行多处理。投反对票。
  • OP 声称使用的是多处理,而不是线程。你是对的,你可以在一个处理器上运行多个线程。但是在单个处理器系统上一次只能处理一个进程。因此可以合理地预期日志记录不会重叠。
  • @FredMitchell 我不知道如何评论,真的。请继续阅读有关多线程/处理系统的信息,以及如何在内核方面解决这个问题(以及为什么您实际上可以在您的 PC 上同时运行多个应用程序)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2011-06-17
相关资源
最近更新 更多