无法让多个uwsgi工人使用flask-socketio

时间:2019-08-01 18:36:53

标签: python redis uwsgi flask-socketio python-socketio

在开发中,带有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加载。

2 个答案:

答案 0 :(得分:1)

您可以根据需要运行任意数量的工作程序,但前提是您必须将每个工作程序作为独立的单工作程序uwsgi进程运行。一旦所有这些工作人员在各自的端口上运行,就可以使用粘性会话将nginx放在前面,以实现负载平衡。当然,您还需要消息队列供工作人员在协调广播时使用。

答案 1 :(得分:0)

最终找到了https://github.com/miguelgrinberg/Flask-SocketIO/issues/535

所以看来您不能同时让uwsgi拥有多个工作人员,因为它需要粘性会话。文档中提到了针对马尼康的说法,但我并没有将其扩展到uwsgi。