Python多进程中规避全局变量,实现单Logger实例共享方案咨询
解决多进程下日志无法输出的问题
问题原因
直接将父进程的Logger实例传递给子进程会因为序列化/反序列化导致Handler失效,加上多进程的内存隔离特性,子进程中的Logger无法正确将日志输出到控制台。
解决方案
通过进程池的initializer参数,在每个子进程启动时统一初始化日志配置,子进程内部直接获取指定名称的Logger即可,无需传递实例。
修改后的代码:
initialization_manager.py
import logging import sys from worker_manager import WorkerManager def setup_logging(): # 配置名为"worker_manager"的Logger,匹配期望的日志格式中的名称 logger = logging.getLogger("worker_manager") logger.setLevel(logging.DEBUG) # 避免子进程重复添加Handler,先清空已有Handler if logger.handlers: logger.handlers.clear() handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter('%(asctime)s . %(name)s . %(levelname)s . %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) def start_project(): worker_manager = WorkerManager() worker_manager.start_workers(setup_logging) if __name__ == '__main__': start_project()
worker_manager.py
from multiprocess import Pool import logging class WorkerManager: def start_workers(self, init_logging): numbers = [1, 2, 3, 4, 5] # 传入初始化函数,让每个子进程启动时执行日志配置 with Pool(5, initializer=init_logging) as pool: pool.map(self.perform_task, numbers) def perform_task(self, number): # 获取预配置的Logger实例 logger = logging.getLogger("worker_manager") logger.debug(f"Number = {number}")
说明
- 主进程定义
setup_logging函数,负责配置指定名称的Logger,确保格式符合需求 - 进程池创建时通过
initializer参数,让每个子进程启动时自动执行日志初始化,保证子进程的Logger配置正确 - 子进程任务中直接获取配置好的Logger,无需传递实例,避免序列化问题
- 初始化时清空已有Handler,防止子进程重复添加导致日志重复输出
内容的提问来源于stack exchange,提问作者alexhak
相关产品推荐
相关产品推荐

