Python中为什么主进程创建子进程的代码块需要写在“if __name__ == ‘__main__‘:下
Python中为什么主进程创建子进程的代码块需要写在“ifname ‘main’:下文章目录Python中为什么主进程创建子进程的代码块需要写在“if __name__ __main__:下一、核心原因Windows 下必加Linux/Mac 建议统一写法二、原理详解三、错误示例会出问题四、正确写法标准规范五、补充说明一、核心原因Windows 下必加Linux/Mac 建议统一写法Python 多进程默认使用 spawn 启动方式Windows 默认子进程会重新导入当前模块如果不放在 ifname ‘main’: 里会造成无限递归创建进程、程序报错崩溃。二、原理详解模块导入机制Python 脚本有两种运行状态1.直接运行脚本此时name ‘main’2.被其他文件导入此时name 模块名多进程 spawn 模式的执行流程Windows1.主进程运行代码创建子进程2.子进程会独立启动 Python 解释器并重新 import 你的当前脚本3.如果创建子进程的代码不在 ifname ‘main’: 内部子进程导入脚本时会再次执行创建子进程的代码不断新建进程 → 无限递归、进程爆炸、程序卡死 / 报错三、错误示例会出问题importmultiprocessing# 直接写在全局没有判断deftask():print(子进程运行)# 问题代码全局创建进程pmultiprocessing.Process(targettask)p.start()p.join()运行后果Windows 下直接报错、无限创建子进程程序无法正常运行。四、正确写法标准规范importmultiprocessingdeftask():print(子进程运行)# 只有当前脚本是主程序时才执行创建进程逻辑if__name____main__:pmultiprocessing.Process(targettask)p.start()p.join()逻辑-主进程运行__name____main__→ 执行创建子进程-子进程导入模块__name__!__main__→ 跳过创建进程代码只加载函数不会递归新建进程五、补充说明1.Linux / Mac 默认使用 fork 方式创建子进程不会重新导入模块不加这句暂时能跑。 但跨平台兼容、代码规范要求必须加上。 2.总结一句话 Windows 下多进程会重新导入模块把创建进程的代码放到 if __name__ __main__: 中可以避免子进程重复创建新进程防止无限递归。