Search code examples
pythonflaskoptimizationpyomo

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


I try to built web UI for solving optimization problem by using Flask as web framework, Pyomo as optimization library and CBC as optimization engine. The error appear when I call solver while running web server.

If I run only optimization task, I get no error. It seems like the problem occur when using with Flask web server.

The error occur when Flask call this line solver = pyomo.SolverFactory('cbc', executable='CBC_PATH')

Error when running web server:

  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

Solution

  • Yes, as long as you have PyUtilib 5.6.3, you have this fix. That said, signal handlers are still on by default. If you want to turn it off, you need to:

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

    References: https://github.com/PyUtilib/pyutilib/issues/31#issuecomment-382479024