指定eventlet wsgi server

时间:2016-11-30 21:47:25

标签: python flask socket.io swagger eventlet

我正在尝试将websocket功能添加到现有应用程序中。该应用程序的现有结构是

/server/__init__.py

from connexion import App
...
connexion_app = App(__name__, specification_dir='swagger/')  # Create Connexion App
app = connexion_app.app  # Configure Flask Application
...
connexion_app.add_api('swagger.yaml', swagger_ui=True)  # Initialize Connexion api

startserver.py

from server import connexion_app

connexion_app.run(
    processes=8,
    debug=True
)

通过这种方式,我能够指定进程数。有一些长期运行的任务使得必须拥有尽可能多的进程。

我已修改应用程序以包含websocket功能,如下所示。似乎我只有一个进程可用。一旦应用程序尝试运行其中一个长时间运行的进程,所有API调用都会挂起。此外,如果长期运行过程失败,则应用程序将处于挂起状态

/server/__init__.py

from connexion import App
import socketio
...
connexion_app = App(__name__, specification_dir='swagger/')  # Create Connexion App
sio = socketio.Server()  # Create SocketIO for websockets
app = connexion_app.app  # Configure Flask Application
...
connexion_app.add_api('swagger.yaml', swagger_ui=True)  # Initialize Connexion api

startserver.py

import socketio
import eventlet

from server import sio
from server import app

myapp = socketio.Middleware(sio, app)
eventlet.wsgi.server(eventlet.listen(('', 5000)), myapp)

我在这里缺少什么?

(旁注:如果您有任何资源可以更好地了解Flask对象的庞然大物,请指出他们!!)

1 个答案:

答案 0 :(得分:1)

  • 问题的确切答案:内置WSGI的Eventlet不支持多个进程。
  • 获取所述问题的最佳解决方案的方法:共享一个包含重现问题所需的绝对最小代码的文件。也许在这里https://github.com/eventlet/eventlet/issues或您喜欢的任何其他方式。
  • 希望的方式。随机的东西:eventlet.monkey_patch(),在单独的线程或进程中隔离Eventlet和长阻塞调用。