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

主进程日志未写入文件:含ProcessPoolExecutor的多进程日志配置疑问

问题原因

主进程的日志没有写入文件,核心原因是主进程未配置QueueHandler:你的代码里仅给子进程和进程池配置了日志转发到队列的逻辑,但主进程自身没有把日志导向main_logging_queue,导致主进程日志只会走默认输出(如控制台),无法进入监听进程处理并写入文件。

解决方案

在主进程启动监听进程后,立即调用configure_logging_for_multiprocessing函数,把主进程的日志也转发到队列。修改if __name__ == '__main__':部分的代码如下:

if __name__ == '__main__':
    main_logging_queue = multiprocessing.Manager().Queue()

    # 启动监听进程
    lp = multiprocessing.Process(target=main_process_listener, args=(main_logging_queue,))
    lp.start()

    # 关键:配置主进程日志,将日志发送到监听队列
    configure_logging_for_multiprocessing(main_logging_queue)

    logging.getLogger('main_1').log(choice(LEVELS), 'main process 1')

    # 启动工作进程
    workers = []
    for i in range(NUMBER_OF_WORKERS):
        worker = multiprocessing.Process(target=worker_process, args=(main_logging_queue,))
        workers.append(worker)
        worker.start()

    # 主进程日志消息(修正原重复内容,方便区分)
    logging.getLogger('main_2').log(choice(LEVELS), 'main process 2')

    # 等待所有工作进程结束
    for w in workers:
        w.join()

    main_logging_queue.put_nowait(None)
    lp.join()
额外说明
  1. 配置后,主进程的所有日志会和子进程日志一样,通过队列转发到监听进程,由监听进程统一写入文件,保持格式一致。
  2. configure_logging_for_multiprocessing中设置了root日志级别为DEBUG,若需要调整主进程日志级别,可单独给特定logger设置(如logging.getLogger('main_1').setLevel(logging.INFO))。
  3. 原代码中main_2的日志内容重复了main process 1,建议改成main process 2便于测试时区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:45:57