在开发中,带有 uwsgi 的 flask-socketio (4.1.0) 只需 1 个工作人员和标准初始化就可以很好地工作。
现在我正在为生产做准备,并想让它与多个工人一起工作。
我做了以下事情:
在 init_app 中添加了 redis message_queue:
socketio = SocketIO()
socketio.init_app(app,async_mode='gevent_uwsgi', message_queue=app.config['SOCKETIO_MESSAGE_QUEUE'])
(旁注:我们也在应用程序本身中使用 redis)
在我们使用 uwsgi 运行的文件顶部进行 gevent 猴子补丁
from gevent import monkey
monkey.patch_all()
运行 uwsgi:
uwsgi --http 0.0.0.0:63000 --gevent 1000 --http-websockets --master --wsgi-file rest.py --callable application --py-autoreload 1 --gevent-monkey-patch --workers 4 --threads 1
这似乎不起作用。连接开始在连接和 400 错误请求响应之间快速交替。我怀疑这些对应于我在启用 SocketIO 日志记录时看到的“无效会话 ....”错误。
最初它根本没有使用redis,
redis-cli > PUBSUB CHANNELS *
即使工人= 1,也会导致空结果。
似乎以下内容(取自另一个 SO 答案)修复了:
# https://stackoverflow.com/a/19117266/492148
import gevent
import redis.connection
redis.connection.socket = gevent.socket
这样做之后,我得到了一个更新数据的“flask-socketio”pubsub 频道。
但是在返回多个工人后,问题又回来了。鉴于更改 redis 套接字似乎确实使事情朝着正确的方向发展,我觉得猴子补丁还不能正常工作,但我使用的代码似乎与我能找到的所有示例相匹配,并且位于文件的最顶部由 uwsgi 加载。