gpt4 book ai didi

python - 无法让多个 uwsgi worker 与 flask-socketio 一起工作

转载 作者:可可西里 更新时间:2023-11-01 11:14:15 27 4
gpt4 key购买 nike

在开发中,带有 uwsgi 的 flask-socketio (4.1.0) 仅需 1 个 worker 和标准初始化就可以很好地工作。

现在我正在为生产做准备,并希望它与多个 worker 一起工作。

我做了以下事情:

在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 Bad 请求响应之间快速交替启动。我怀疑这些对应于我在启用 SocketIO 日志记录时看到的“无效 session ....”错误。

一开始根本没有用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 channel 。

但是返回给多个worker后,问题又回来了。鉴于更改 redis 套接字似乎确实使事情朝着正确的方向发展,我觉得 monkeypatching 还没有正常工作,但我使用的代码似乎与我能找到的所有示例相匹配,并且位于文件的最顶部由 uwsgi 加载。

最佳答案

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

关于python - 无法让多个 uwsgi worker 与 flask-socketio 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com