Python 3.6.5多进程报错:非__main__启动进程的解决方案求助
解决非__main__模块启动多进程的RuntimeError问题
这个报错的核心原因是Python在使用spawn启动子进程时(比如Windows系统或Python 3.4+部分默认配置),会重新加载整个主模块。如果主模块没有做防护,代码会在子进程中重复执行,导致进程启动逻辑被递归触发,最终抛出错误。哪怕进程是在子模块里启动的,主入口的防护依然是关键。
具体修改方案
只需要给主入口文件one.py加上if __name__ == '__main__':的防护逻辑即可,其他文件无需改动:
修改后的one.py
import two if __name__ == '__main__': # 只有当脚本作为主程序运行时才执行调用逻辑 two.call3('txt here')
two.py保持不变
import three import multiprocessing def call3(txt1): test = multiprocessing.Process(target=three.test1, kwargs={"txt1": txt1}) test.start()
three.py保持不变
def test1(txt1): print(txt1)
原理说明
当你运行one.py时:
- 主进程中
__name__的值是'__main__',所以会执行two.call3('txt here'),进而创建子进程。 - 子进程启动时,会重新导入
one.py,但此时__name__不再是'__main__'(而是子进程的模块名),所以不会执行two.call3,避免了递归创建进程的问题。 - 子进程正常加载
two.py和three.py,执行three.test1函数,打印出内容。
另外,multiprocessing.freeze_support()只有在你要把程序打包成可执行文件时才需要添加,普通运行场景可以省略。
内容的提问来源于stack exchange,提问作者Rhys
相关产品推荐
相关产品推荐

