如何解决为什么在没有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 举报,一经查实,本站将立刻删除。