2016-01-11 77 views
3

我嘗試使用多處理記錄,並發現在Windows下,我會在子進程中得到不同的根記錄器,但在Linux下,這是確定的。python與多處理日誌記錄,根記錄器在Windows中不同

測試代碼:

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> 

但是下Windows 7,64位,我會變得不同主FUNC之間根記錄:

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

,如果我在初始化腳本主要根記錄器,我怎麼能保持設置,例如Windows下的子進程的水平?

回答

2

在我看來,這可能與the following platform-dependant behaviour

16.6.3.2。視窗 由於Windows缺少os.fork()它有一些額外的限制:

(...)

全局變量

記住,如果一個子進程運行的代碼試圖訪問一個 全局變量,則它所看到的值(如果有)可能與Process.start爲 時調用的父進程中的值不同。

但是,只是模塊級別常量的全局變量導致 沒有問題。

從你的問題,我認爲這導致logging.basicConfig()調用沒有達到你所有的進程。解決方案是讓您的子進程登錄到Queue(使用QueueHandler),並在您的主進程中有一個專用線程監聽隊列。

+0

謝謝,我認爲這是真正的原因,我看到了另一個類似的答案http://stackoverflow.com/a/14643726/1276501。順便說一句,「QueueHandler」似乎只存在於python 3.x中 –

相關問題