问题描述
我正在尝试了解差分进化方法的并行执行。 我使用了文档中的 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 解释器,这就是不需要保护入口点的原因。