Python多进程下UUID在CentOS与Windows表现不一致是什么原因
问题根本原因
该差异是Python multiprocessing 模块的默认进程启动方式跨平台不同导致的:
- Windows系统默认使用
spawn模式启动子进程:该模式会为每个子进程启动独立的Python解释器,重新导入所有依赖模块。fileOne.py中的顶层代码sessionID = uuid.uuid4().hex会在每个子进程导入模块时重新执行,因此每个子进程都会生成新的UUID,和预期一致。 - CentOS等Linux系统默认使用
fork模式启动子进程:该模式会直接复制父进程的完整内存空间,包括父进程已经导入完成的模块、已经计算完成的全局变量值。父进程启动时已经执行过fileOne.py的顶层代码生成了固定的sessionID,所有fork出来的子进程会直接复用这个已有的值,不会重新执行UUID生成逻辑,因此所有子进程的UUID都相同,只有重启父进程时才会重新生成。
解决方案
方案1:强制指定进程启动模式为spawn
在主进程的入口代码最开头添加如下配置,即可让Linux系统的进程启动行为和Windows保持一致:
import multiprocessing if __name__ == '__main__': multiprocessing.set_start_method('spawn')
方案2:封装UUID生成逻辑,避免顶层执行
修改fileOne.py,将UUID生成逻辑封装为函数,子进程启动后主动调用生成当前进程的唯一ID:fileOne.py修改后:
import uuid def generate_session_id(): return uuid.uuid4().hex
子进程初始化阶段调用生成全局sessionID即可,保证每个进程独立生成新值。
方案3:fork后重载模块
如果不想修改原有代码结构,可以在子进程导入sessionID之前重载fileOne模块,强制重新执行顶层代码:
from importlib import reload import fileOne reload(fileOne) from fileOne import sessionID
内容的提问来源于stack exchange,提问作者Oksana Ok
相关产品推荐
相关产品推荐

