python多处理日志记录,windows中的根日志记录程序不同

python多处理日志记录,windows中的根日志记录程序不同,python,windows,logging,multiprocessing,Python,Windows,Logging,Multiprocessing,我尝试使用多处理进行日志记录,发现在windows下,我将在子进程中获得不同的根日志记录程序,但在Linux下这是可以的 测试代码: main.py: #!/usr/bin/env python # -*- coding: utf-8 -*- import logging import multiprocessing from mymod import func def m_func(): server = multiprocessing.Process(target=func, ar

我尝试使用多处理进行日志记录,发现在windows下,我将在子进程中获得不同的根日志记录程序,但在Linux下这是可以的

测试代码:

main.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()
mymod.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>
在main中:
在func中:
但在64位Windows 7下,我将在main和func之间获得不同的根记录器:

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

如果我在主脚本中初始化根记录器,如何在windows下保持子进程中的级别等设置?

我认为这可能与以下内容有关:

16.6.3.2。窗户 由于Windows缺少os.fork(),因此它有一些额外的限制:

(……)

全局变量

请记住,如果在子进程中运行的代码试图访问 全局变量,则它看到的值(如果有)可能不同 作为创建process.start时父进程中的值 打电话来

但是,仅为模块级常量的全局变量会导致 没问题


根据您的问题,我假设这会导致一个
logging.basicConfig()
调用,该调用不会到达所有进程。解决方法是让您的子进程登录到
队列
(使用
队列处理程序
),并在主进程中有一个专用线程来侦听队列。

谢谢,我认为这确实是原因,我已经看到了另一个类似的答案。顺便说一句,
QueueHandler
似乎只存在于Python3.x中