问题描述
我有一个带有处理程序功能和父功能的多处理设置。这是一个简化的版本:
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 (将#修改为@)