Почему logging.Logger сбрасывает свое состояние в новом процессе в Windows? - PullRequest
0 голосов
/ 30 мая 2019

У меня странная проблема с модулем регистрации Python в Windows.Код ниже показывает это:

import multiprocessing
import logging
import sys



class ProcessLogger(multiprocessing.Process):
    def __init__(self):
        super().__init__()
        self.create_logger()
        print('state of logger in main proccess:')
        print(self.logger)
        print(self.logger.handlers)

    def run(self):
        print('state of logger in child proccess:')
        print(self.logger)
        print(self.logger.handlers)

    def create_logger(self):
        self.logger = logging.getLogger('something')
        self.logger.setLevel(logging.DEBUG)
        handler = logging.StreamHandler()
        self.logger.addHandler(handler)


if __name__ == '__main__':
    logg = ProcessLogger()
    logg.start()
    logg.join()
    print(sys.version)

он печатает следующий вывод в Windows:

state of logger in main proccess:
<Logger something (DEBUG)>
[<StreamHandler <stderr> (NOTSET)>]
state of logger in child proccess:
<Logger something (WARNING)>
[]
3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]

по какой-то причине объект регистратора в новом процессе имеет состояние по умолчанию.

Iпопробовал это на Ubuntu, и, кажется, работает как ожидалось:

state of logger in main proccess:
<Logger something (DEBUG)>
[<StreamHandler <stderr> (NOTSET)>]
state of logger in child proccess:
<Logger something (DEBUG)>
[<StreamHandler <stderr> (NOTSET)>]
3.7.1 (default, Oct 22 2018, 11:21:55) 
[GCC 8.2.0]

Это ожидаемое поведение в Windows?Может кто-нибудь объяснить это?

1 Ответ

0 голосов
/ 31 мая 2019

Причина, по которой вы наблюдаете вышеупомянутое поведение в двух операционных системах, связана с различием между fork (Unix) и spawn (Windows) стратегиями запуска процесса .

С помощью стратегии fork дочерний процесс создается как точный клон родительского процесса. Сначала эти два процесса будут идентичны, и дочерний процесс разделит все свойства (открытые файлы, варианты конфигурации и т. Д.) Родительского процесса.

Вместо стратегии spawn запускается новый пустой процесс. Процессу дается модуль Python для загрузки и указатель на первую инструкцию для выполнения в методе run. Все операции, выполняемые родителем заранее, не наследуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...