在python中,如果在父进程中配置了记录器,那么子进程也会获取该记录器吗?更清楚地说,在我的应用程序中,我通过向父进程添加logger = logging.getlogger()处理程序来配置根记录器。现在,当一个子进程被分叉时,它就会
logger = logging.getlogger()
logger.info("dfsdf")
Run Code Online (Sandbox Code Playgroud)
然后所有日志都会根据父级的根记录器进行处理。我没有为孩子配置根记录器。这怎么可能?它们是两个不同的进程,那么它们怎么能有相同的记录器呢?
当您派生一个进程时,它会“继承”父进程内存,包括记录器配置。
来自Fork 维基百科页面:
fork 操作为子进程创建一个单独的地址空间。子进程具有父进程所有内存段的精确副本,但如果实现了写时复制语义,则可能不会分配实际的物理内存(即,两个进程可能会暂时共享相同的物理内存段) 。父进程和子进程都拥有相同的代码段,但彼此独立执行。
这并不是 Python 所独有的。任何分叉的 UNIX 进程都会发生这种情况,无论它是用 C、Perl 还是 Python 实现的。
该multiprocessing模块使用它(在支持它的平台上)来快速启动新进程。
请注意,继承记录器可能会导致竞争条件;该logging模块只知道线程安全;它使用线程锁来序列化对处理程序的访问,但该锁不在进程之间共享(子进程中的所有内容都是副本,而不是同一个对象)。
这意味着,当您同时记录来自父进程和子进程的消息时,当操作系统在将日志条目写入文件时在两个进程之间切换时,日志条目最终可能会混合在一起。
| 归档时间: |
|
| 查看次数: |
3539 次 |
| 最近记录: |