在Linux上使用Python 2.7多处理。进程和日志记录,如何/为什么记录顺序?

时间:2013-10-13 21:50:12

标签: python linux logging multiprocessing

我有一个队列工作delagator,通过自定义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()。

2 个答案:

答案 0 :(得分:2)

我不知道你的spawner是如何工作的,但如果它遵循一个非常简单的模式:

logger = get_logger() # Gets logger instance)

class Foo:
    #Definition

while(True):
    #A loop that spawns processes

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

您可以进行实验并从日志记录中删除文件处理程序,您会发现它们仍然是顺序的,因为两个进程非常罕见,即使完全相同,也可以同时完成。

答案 1 :(得分:0)

如果您只有一个处理器,则应该预期您会获得的行为。