为什么在没有QueueListener的情况下多处理日志记录可以工作?

问题描述

我有一个带有处理程序功能和父功能的多处理设置。这是一个简化的版本:

from functools import partial
from typing import List
import logging
from logging.handlers import QueueHandler,QueueListener
from multiprocessing import Manager,Pool,Queue

def parent_func(log_file: str,task_list: List[str]):
    # Setup the root logger
    logger = getLogger()
    logger.addHandler(FileHandler(log_file))

    # Setup the logging listener,which should log to the log file and to stdout
    manager = Manager()
    queue = manager.Queue()
    # Copy all handlers from the root logger
    listener = QueueListener(queue,*logger.handlers)
    listener.start()

    # Fork into workers
    with Pool() as pool:
        func = partial(
            worker_func,logging_queue=queue,)
        pool.map(func,task_list)
    listener.stop()

def worker_func(
    data: str,logging_queue: Queue,): 
    # Note: this logger is totally disconnected from the parent logger since it shares no handlers
    logger = getLogger(data)
    logger.handlers = []
    logger.addHandler(QueueHandler(logging_queue))

    logger.info("Processing {}".format(data))

问题是:

  • 使用此代码,辅助函数中的每个logger.info调用都会将所有内容记录到标准输出两次,并且
  • 如果我完全删除listener变量,我仍然会以某种方式从工作器函数接收日志(即使它们在不同的进程上运行!)

这意味着我做错了什么,因为日志记录队列似乎根本没有必要。我在这里做什么错了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)