0

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

4

2 回答 2

2

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

logger = get_logger() # Gets logger instance)

class Foo:
    #Definition

while(True):
    #A loop that spawns processes

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

您可以进行实验并从日志记录中删除文件处理程序,您会注意到它们仍然是顺序的,因为两个进程很少发生,即使是完全相同的,同时完成。

于 2013-10-13T22:11:28.387 回答
0

如果你只有一个处理器,那么你得到的行为应该是可以预料的。

于 2013-10-13T22:11:45.387 回答