微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 scipy.differential_evolution 中执行 workers 参数时出错

如何解决在 scipy.differential_evolution 中执行 workers 参数时出错

我正在尝试了解差分进化方法的并行执行。 我使用了文档中的 example

from scipy.optimize import rosen,differential_evolution
bounds = [(0,2),(0,2)]
result = differential_evolution(rosen,bounds,updating='deferred',workers=2)

但它抛出以下错误

enter image description here

有人可以建议一种方法解决这个问题。

解决方法

如果提供了 workers 参数,该 Scipy 函数会在后台使用 multiprocessing 模块。因此,我们必须在“安全导入主模块”一节中“通过使用 if __name__ == '__main__'as the documentation insists 来“保护程序的入口点”。

if __name__ == '__main__':
    from scipy.optimize import rosen,differential_evolution
    bounds = [(0,2),(0,2)]
    result = differential_evolution(rosen,bounds,updating='deferred',workers=2)
    print(result)

Scipy 文档中的示例在交互式 Python 会话中运行,这不是必需的。但是当作为脚本运行时,我们必须添加代码围栏以避免您遇到的错误。否则,优化运行会在多个进程中的每一个进程中一遍又一遍地启动。

在 Linux 上运行脚本时也不需要代码围栏。在该平台上,工作进程的默认 "start method" 是“fork”(如错误消息中所述),而不是 Windows 和 macOS 上的“spawn”。 “fork”方法更轻量级,并且避免了重新启动 Python 解释器,这就是不需要保护入口点的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。