【问题标题】:where to put freeze_support() in a Python script?在 Python 脚本中将 freeze_support() 放在哪里?
【发布时间】:2014-08-13 23:41:17
【问题描述】:

我对将freeze_support() 用于multiprocessing 感到困惑,没有它我得到Runtime Error。我只是在运行一个脚本,而不是定义一个函数或一个模块。我还能用吗?或者我要导入的包应该使用它吗?

Here 是文档。

请注意,具体问题是关于 scikit-learn 调用 GridSearchCV 尝试并行生成进程。我不确定我的脚本是否需要为此冻结,或者某些被调用的代码(来自 Anaconda 发行版)。如果详细信息与此问题相关,请转到更具体的 question

【问题讨论】:

  • 你的脚本是如何执行的?
  • @dano 好的,那么具体问题是相关的。我的整个代码都粘贴在那里。 (但链接指向了错误的问题,我修复了它。)在专用的 Python 解释器(来自 Spyder)中执行。

标签: python scikit-learn multiprocessing runtime-error


【解决方案1】:

在 Windows 上所有您的multiprocessing-using 代码必须由if __name__ == "__main__": 保护

为了安全起见,我会将您当前位于脚本顶层的所有代码放在 main() 函数中,然后在顶层执行此操作:

if __name__ == "__main__":
    main()

请参阅“安全导入主模块”小节here,了解为什么需要这样做。你可能根本不需要打电话给freeze_support,尽管加入它不会有什么坏处。

请注意,无论如何,最好对脚本使用if __name__ == "__main__" 保护,这样如果您发现将来某个时候需要将您的脚本import 转换为另一个脚本,则代码不会意外执行。

【讨论】:

  • 听起来不错,谢谢,我会让你知道它是如何运行的,然后我很乐意接受。
  • 唯一没有涵盖的场景是当有人创建一个继承自 Process 的对象时,即:类 myProcess(Process),那么在该场景中你将 freeze_support 放在哪里?
  • 谢谢。这个在if __name__ == "__main__": 中不使用多处理的错误让我感到惊讶。尽管我总是在if 子句中使用多处理函数,但我不知道多处理要求。这是我第一次在if 子句之外使用代码,它给出了错误RuntimeError: Attempt to start a new process before the current process has finished its bootstrapping phase
猜你喜欢
  • 2014-11-08
  • 2015-11-12
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多