如何解决在 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)
但它抛出以下错误:
解决方法
如果提供了 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 举报,一经查实,本站将立刻删除。