在python中,如果在父进程中配置了记录器,那么子进程也会获取该记录器吗?更清楚地说,在我的应用程序中,我通过执行以下操作为父进程配置根记录器logger = logging.getlogger()
并向其中添加处理程序。现在,当一个子进程被分叉时,它就会
logger = logging.getlogger()
logger.info("dfsdf")
然后所有日志都会根据父级的根记录器进行处理。我没有为孩子配置根记录器。这怎么可能?它们是两个不同的进程,那么它们怎么能有相同的记录器呢?
当您分叉一个进程时,它会“继承”父进程内存,包括记录器配置。
来自分叉维基百科页面 http://en.wikipedia.org/wiki/Fork_%28operating_system%29:
fork 操作为子进程创建一个单独的地址空间。子进程具有父进程所有内存段的精确副本,但如果实现了写时复制语义,则可能不会分配实际的物理内存(即,两个进程可能会暂时共享相同的物理内存段) 。父进程和子进程都拥有相同的代码段,但彼此独立执行。
这并不是 Python 所独有的。任何分叉的 UNIX 进程都会发生这种情况,无论它是用 C、Perl 还是 Python 实现的。
The multiprocessing module http://docs.python.org/2/library/multiprocessing.html使用它(在支持它的平台上)来快速启动新进程。
请注意,继承记录器可能会导致竞争条件;这logging
模块只知道线程安全;它使用线程锁来序列化对处理程序的访问,但该锁不在进程之间共享(子进程中的所有内容都是副本,而不是同一个对象)。
这意味着,当您同时记录来自父进程和子进程的消息时,当操作系统在将日志条目写入文件时在两个进程之间切换时,日志条目最终可能会混合在一起。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)