set_start_method ('spawn') сбрасывает конфигурации регистратора - PullRequest
0 голосов
/ 25 апреля 2019

Рассмотрим следующий фрагмент:

import logging
import logging.config
from multiprocessing import Process, set_start_method

try:
    set_start_method('spawn')
except RuntimeError:
    pass


def log(logger):
    for _ in range(10):
        logger.info('FLAG2')


if __name__ == '__main__':
    config = {
        "version": 1,
        "formatters": {
            "timestamp": {
                "format": "%(asctime)s: %(message)s"
            },
        },
        "handlers": {
            "stdout": {
                "level": "INFO",
                "formatter": "timestamp",
                "class": "logging.StreamHandler",
                "stream": "ext://sys.stdout"
            },
        },
        "loggers": {
            "some_logger": {
                "level": "INFO",
                "handlers": ["stdout"]
            }
         }
    }

    logging.config.dictConfig(config)

    logger = logging.getLogger("some_logger")

    for _ in range(10):
        logger.info('FLAG1')

    p = Process(target=log, args=(logger,))

    p.start()

    p.join()

Это напечатает FLAG1 десять раз, включая метки времени, FLAG2 не будет записано в стандартный вывод.Если я удаляю вызов set_start_method('spawn'), отображаются и FLAG1, и FLAG2, и я предполагаю, что это происходит из-за того, что порожденному потоку не хватает какой-то глобальной конфигурации регистратора, созданной dictConfig.Тем не менее, есть ли способ передать регистратор в порожденный поток и сохранить то же поведение в журнале без необходимости передавать словарь конфигурации регистратора?

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