在Python脚本中放置freeze_support()函数的位置应该在哪里?

66

我对使用multiprocessing时需要使用freeze_support()感到困惑,如果不使用它,会出现运行时错误/Runtime Error。 我只在运行脚本,没有定义函数或模块。 我可以继续使用吗?还是我导入的包需要使用它?

这里是相关文档。

请注意,具体问题涉及scikit-learn调用GridSearchCV,后者尝试并行生成进程。 我不确定是否需要冻结我的脚本,或者从Anaconda发行版中调用的某些代码。 如果细节与此问题有关,请访问更具体的问题


2
你的脚本是如何执行的? - dano
1
@dano 好的,那么具体问题是相关的。我把整个代码都粘贴在那里了。(但链接指向错误的问题,我已经修复了。)在专用的 Python 解释器(来自 Spyder)中执行。 - László
1个回答

109

在Windows系统上,所有使用multiprocessing的代码都必须被if __name__ == "__main__":保护。

因此,为了安全起见,我建议将你脚本目前位于顶层的所有代码放入一个main()函数中,然后只需在顶层执行以下操作:

if __name__ == "__main__":
    main()
请参见“安全导入主模块”小节这里,以了解为什么这是必要的。尽管包含它不会有任何问题,但你可能根本不需要调用freeze_support
请注意,使用if __name__ == "__main__"保护脚本是一种最佳实践,这样如果将来需要在另一个脚本中import您的脚本,代码不会意外执行。

1
太棒了,谢谢,我会告诉你它的运行情况,然后我就愿意接受。 - László
13
唯一未涵盖的情况是当某人创建一个继承自Process的对象,例如:class myProcess(Process),那么在这种情况下应该把freeze_support放在哪里? - Har
2
谢谢。我很吃惊地发现没有在 if __name__ == "__main__": 内使用多处理时出现了这个错误。虽然我总是在 if 子句中使用多处理函数,但我并不知道需要使用多处理。这是我第一次在 'if' 子句之外使用该代码,结果出现了错误:RuntimeError: Attempt to start a new process before the current process has finished its bootstrapping phase - Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接