首页 > 解决方案 > 生产 Flask-SocketIO + ZeroRPC

问题描述

我已经部署了一个flask-socketio Web服务器,但是在安装了安装gevent的zerorpc之后,我遇到了很多麻烦..起初我的代码看起来像这样:

socketio.start_background_task(poll_events)
socketio.run(app, host="0.0.0.0", keyfile='key.pem', certfile='cert.pem')

我正在启动一个后台任务,它将不断从队列中读取并通过 socketio 发送消息。现在 gevent 已安装,flask-socketio 将尝试使用它(实际上我可以将我的服务器设为生产服务器而不是开发服务器),但随后 socketio.start_background_task 块。所以我读到了

from gevent import monkey; monkey.patch_all()

是必须的。所以现在我的代码看起来像这样:

socketio.start_background_task(poll_events)
WSGIServer(('0.0.0.0', 5000), app, keyfile='key.pem', certfile='cert.pem').serve_forever()

出于某种原因,在使用 pycharm 进行调试时,我收到了很多奇怪的 greenlet 异常,而且我认为有时 socketio 消息会被丢弃,所以我决定使用 eventlet。再说一次,需要打补丁。所以我的代码如下所示:

socketio.start_background_task(poll_events)
eventlet.wsgi.server(eventlet.wrap_ssl(eventlet.listen(("0.0.0.0", 5000)), keyfile='key.pem', certfile='cert.pem'), app)

由于猴子修补 zerorpc 抛出异常“gevent.exceptions.LoopExit:此操作将永远阻塞”

使用flask + socketio + zerorpc部署生产服务器的正确方法是什么?

标签: pythonflaskwsgizerorpc

解决方案


我已经解决了这个问题,在调试时我选择“线程”作为 async_mode

 socketio = SocketIO(app, async_mode="threading")

当使用 gunicorn 部署时,我使用 gevent

CMD ["gunicorn", "-w", "1", "-k", "gevent","--reload", "web_app:app"]

出于某种原因,gevent 没有 gunicorn 就不能工作,而 eventlet 不能和 zerorpc 一起工作。


推荐阅读