gpt4 book ai didi

python 多处理日志记录,根记录器在 windows 中不同

转载 作者:可可西里 更新时间:2023-11-01 14:14:30 26 4
gpt4 key购买 nike

我尝试使用 multiprocessing 进行日志记录,发现在 windows 下,我会在子进程中获得不同的根记录器,但在 Linux 下没问题。

测试代码:

主要.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import multiprocessing
from mymod import func

def m_func():
server = multiprocessing.Process(target=func, args=())
server.start()

logger = logging.getLogger()
#print 'in global main: ', logger

if __name__ == '__main__':
print 'in main: ', logger
m_func()

我的模组.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging

logger = logging.getLogger()
# print 'in global func: ', logger

def func():
print 'in func: ', logger

在Linux下,结果是:

in main:  <logging.RootLogger object at 0x10e4d6d90>
in func: <logging.RootLogger object at 0x10e4d6d90>

但是在 Windows 7 64 位下,我会在 main 和 func 之间得到不同的根记录器:

in main:  <logging.RootLogger object at 0x00000000021FFD68>
in func: <logging.RootLogger object at 0x00000000023BC898>

如果我在主脚本中初始化root logger,我如何在windows下的子进程中保留级别等设置?

最佳答案

在我看来,这可以链接到 the following platform-dependant behaviour :

16.6.3.2. Windows Since Windows lacks os.fork() it has a few extra restrictions:

(...)

Global variables

Bear in mind that if code run in a child process tries to access a global variable, then the value it sees (if any) may not be the same as the value in the parent process at the time that Process.start was called.

However, global variables which are just module level constants cause no problems.

根据您的问题,我假设这会导致 logging.basicConfig() 调用未到达您的所有进程。一个解决方案是让您的子进程记录到 Queue(使用 QueueHandler),并在您的主进程中有一个专用线程来监听队列。

关于python 多处理日志记录,根记录器在 windows 中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724643/

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