You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

说明

  1. 主进程定义setup_logging函数,负责配置指定名称的Logger,确保格式符合需求
  2. 进程池创建时通过initializer参数,让每个子进程启动时自动执行日志初始化,保证子进程的Logger配置正确
  3. 子进程任务中直接获取配置好的Logger,无需传递实例,避免序列化问题
  4. 初始化时清空已有Handler,防止子进程重复添加导致日志重复输出

内容的提问来源于stack exchange,提问作者alexhak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:01:28