python - 生产 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部署生产服务器的正确方法是什么?
解决方案
我已经解决了这个问题,在调试时我选择“线程”作为 async_mode
socketio = SocketIO(app, async_mode="threading")
当使用 gunicorn 部署时,我使用 gevent
CMD ["gunicorn", "-w", "1", "-k", "gevent","--reload", "web_app:app"]
出于某种原因,gevent 没有 gunicorn 就不能工作,而 eventlet 不能和 zerorpc 一起工作。
推荐阅读
- python - 在 JPG 文件中嵌入数据而不更改 python 中的图像
- python - Python中的递归前序二叉树遍历 - 无类型错误
- sql - 在单个查询中获取分页行和总数
- command-line - 为什么 GREP end of line 不适用于此文件?
- module - Tricentis Tosca - 添加 TestStep 模块不包括模块的控件?
- c# - 如果目前仅提供部分内容,如何使用 c# 获取 HTTPWebRequest 的完整 json 内容?
- c - 无法将所有行 fscanf 到 Struct 数组中
- r - R,加回拟合值 plm(),拟合值小于回归中的观测值
- python - 读取 highpiexl 图像并使用 GrabCut 获取片段
- javascript - 我无法在 Google 表格上操作 JSON