Python多进程异常:脚本运行与IPython执行行为不一致
Python多进程导致模块重复加载、日志失效问题解决
程序结构
dielectric_functions.py:程序入口,通过调用routines.py的函数组织计算流程routines.py:核心功能模块,其中某函数存在多进程相关问题cartmoments.py:实现类对象及并行化处理函数,未导入routines.py
问题现象
- 在IPython环境中执行
from dielectric_functions import *后调用main(),程序运行完全正常 - 直接通过命令行执行
python3 dielectric_functions.py时,出现以下异常:- 日志功能失效(输出被破坏)
routines.py模块被重复加载数十次- 计算结果正确,但程序运行逻辑出现异常(模块重复加载)
运行环境
- Python 3.12.4
- macOS M3 Pro 虚拟环境(11核)
解决方案
将routines.py中使用的multiprocessing.Pool初始化代码,改为指定fork上下文创建进程池:
import multiprocessing as mp # 替换原 Pool(10) 初始化代码 pool = mp.get_context('fork').Pool(10)
原因说明
macOS 从 Python 3.8 开始,multiprocessing 默认采用 spawn 方式创建子进程。spawn 会启动全新的Python解释器,重新导入主模块及依赖模块,这就导致了routines.py被重复加载,同时日志对象被多次初始化,最终造成日志功能失效。而fork方式是直接复制父进程的地址空间,不会重新导入模块,从根源上避免了该问题。
内容的提问来源于stack exchange,提问作者Aman Singal
相关产品推荐
相关产品推荐

