python - 在使用 Python 2.7 multiprocessing.Process 和日志记录的 Linux 上,日志记录如何/为什么是顺序的?

标签 python linux logging multiprocessing

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

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

日志配置反射(reflect)了 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()。

最佳答案

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

logger = get_logger() # Gets logger instance)

class Foo:
    #Definition

while(True):
    #A loop that spawns processes

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

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

关于python - 在使用 Python 2.7 multiprocessing.Process 和日志记录的 Linux 上,日志记录如何/为什么是顺序的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350675/

相关文章:

python - 为什么元组在分配相同的值时不会获得相同的 ID?

linux - Perl 中 "open function"和 "touch command"的区别?

linux - 如何限制从 grep 返回的结果数?

java - 如何自定义我的 log4j2.xml 参数

使用 log4j 和 log4j.yaml 进行 java 日志记录

python - PyTorch:如何从张量中采样,其中张量中的每个值都有不同的被选择可能性?

python - 如何根据来自 for 循环的值创建多维列表

python - 使用 Tensorflow 在 2D 张量中查找唯一值

Linux shell 脚本复制目录中文件的最后几行以附加到另一个目录中的文件

c# - 每个客户端和日期的单独日志文件和目录