我正在尝试了解差分进化方法的并行执行。我使用了文档中的示例:
from scipy.optimize import rosen, differential_evolution
bounds = [(0,2), (0, 2), (0, 2), (0, 2), (0, 2)]
result = differential_evolution(rosen, bounds, updating='deferred',workers=2)
但它会引发以下错误:
有人可以建议一种解决这个问题的方法吗?
如果提供了参数,则该 Scipy 函数会在后台使用多处理模块。因此,我们必须“使用”workers
来保护程序的入口点,正如文档在“安全导入主模块”部分中所强调的那样。if __name__ == '__main__'
if __name__ == '__main__':
from scipy.optimize import rosen, differential_evolution
bounds = [(0,2), (0, 2), (0, 2), (0, 2), (0, 2)]
result = differential_evolution(rosen, bounds, updating='deferred',workers=2)
print(result)
Scipy 文档中的示例是在交互式 Python 会话中运行的,因此不需要这样做。但是,当作为脚本运行时,我们必须添加代码隔离以避免您遇到的错误。否则,优化运行会在多个进程中的每一个进程中一遍又一遍地启动。
在 Linux 上运行脚本时,代码隔离也不是必需的。在该平台上,工作进程的默认“启动方法”是“fork”(如错误消息中所述),而不是 Windows 和 macOS 上的“spawn”。 “fork”方法更轻量,避免重新启动 Python 解释器,这就是无需保护入口点的原因。