【发布时间】: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