gpt4 book ai didi

python - 父进程和子进程都可以访问记录器吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:50 26 4
gpt4 key购买 nike

在python中如果在父进程中配置了一个logger,那么子进程是否也会得到那个logger?更清楚地说,在我的应用程序中,我通过执行 logger = logging.getlogger() 并向其添加处理程序来为父进程配置根记录器。现在,当一个子进程被 fork 时,它会执行

logger = logging.getlogger()
logger.info("dfsdf")

然后所有的日志都根据parent的root logger进行处理。我没有为 child 配置根记录器。这怎么可能?它们是两个不同的进程,那么它们怎么会有相同的记录器呢?

最佳答案

当您 fork 一个进程时,它会“继承”父进程内存,包括记录器配置。

来自Fork Wikipedia page :

The fork operation creates a separate address space for the child. The child process has an exact copy of all the memory segments of the parent process, though if copy-on-write semantics are implemented actual physical memory may not be assigned (i.e., both processes may share the same physical memory segments for a while). Both the parent and child processes possess the same code segments, but execute independently of each other.

这不是 Python 独有的;对于任何 fork 的 UNIX 进程都会发生这种情况,无论它是用 C、Perl 还是 Python 实现的。

multiprocessing module使用它(在支持它的平台上)快速启动新流程。

请注意,继承记录器可能会导致竞争条件; logging 模块只知道线程安全;它使用线程锁来序列化对处理程序的访问,但该锁不会跨进程共享(子进程中的所有内容都是一个副本,而不是同一个对象)。

这意味着当您同时记录来自父进程和子进程的消息时,随着操作系统在将日志条目写入文件时在两个进程之间切换,日志条目最终可能会混合在一起。

关于python - 父进程和子进程都可以访问记录器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com