在 Flask Web 服务器中使用 Pyomo 时如何解决错误?

How to solve error while using Pyomo in Flask web server?

我尝试通过使用 Flask 作为 Web 框架、Pyomo 作为优化库和 CBC 作为优化引擎来构建 Web UI 来解决优化问题。当我在 运行ning 网络服务器时调用求解器时出现错误。

如果我运行只有优化任务,我就不会出错。问题似乎是在使用 Flask 网络服务器时出现的。

Flask调用此行时出现错误solver = pyomo.SolverFactory('cbc', executable='CBC_PATH')

运行宁网络服务器时出错:

  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\base\solvers.py", line 582, in solve
    _status = self._apply_solver()
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\solver\shellcmd.py", line 244, in _apply_solver
    self._rc, self._log = self._execute_command(self._command)
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\solver\shellcmd.py", line 308, in _execute_command
    define_signal_handlers = self._define_signal_handlers
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyutilib\subprocess\processmngr.py", line 545, in run_command
    = signal.signal(signal.SIGINT, handler)
  File "c:\users\siwapolt\appdata\local\continuum\anaconda3\Lib\signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread

是的,只要你有 PyUtilib 5.6.3,你就有这个修复。也就是说,信号处理程序默认情况下仍处于打开状态。如果你想关闭它,你需要:

import pyutilib.subprocess.GlobalData
pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False

参考文献:https://github.com/PyUtilib/pyutilib/issues/31#issuecomment-382479024