在开发中,带有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)
gevent猴子在我们用uwsgi运行的文件顶部进行修补
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” pubsub通道,用于更新数据。
,但返回多个工作人员后,问题又回来了。鉴于更改redis套接字似乎确实可以使事情朝着正确的方向发展,我觉得Monkeypatching尚无法正常工作,但是我使用的代码似乎与我可以找到的所有示例匹配,并且位于文件的最顶部由uwsgi加载。
答案 0 :(得分:1)
您可以根据需要运行任意数量的工作程序,但前提是您必须将每个工作程序作为独立的单工作程序uwsgi进程运行。一旦所有这些工作人员在各自的端口上运行,就可以使用粘性会话将nginx放在前面,以实现负载平衡。当然,您还需要消息队列供工作人员在协调广播时使用。
答案 1 :(得分:0)
最终找到了https://github.com/miguelgrinberg/Flask-SocketIO/issues/535
所以看来您不能同时让uwsgi拥有多个工作人员,因为它需要粘性会话。文档中提到了针对马尼康的说法,但我并没有将其扩展到uwsgi。