【发布时间】:2019-08-01 18:36:53
【问题描述】:
在开发中,带有 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 monkey 修补
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 *
即使 workers=1 也会导致空结果。
似乎以下(取自另一个 SO 答案)修复了:
# https://stackoverflow.com/a/19117266/492148
import gevent
import redis.connection
redis.connection.socket = gevent.socket
这样做后,我得到了一个“flask-socketio”发布订阅频道,其中包含更新数据。
但在返回多个工人后,问题又回来了。鉴于更改 redis 套接字似乎确实使事情朝着正确的方向发展,我觉得猴子补丁还不能正常工作,但我使用的代码似乎与我能找到的所有示例相匹配,并且位于文件的最顶部由uwsgi加载。
【问题讨论】:
标签: python redis uwsgi flask-socketio python-socketio