python - 使用flask-socketio,如何在一个函数中异步发出多条消息?
问题描述
我正在使用 flask-socketio 模块构建一个 Flask Web 应用程序来实现 websockets。它通常工作正常,但是当我尝试在 for 循环中从服务器向客户端发出多条消息时,所有消息实际上都是一次发送的 - 也就是说,一旦所有消息都被创建。
我读到解决方案可能是使用能够异步任务处理的 eventlet 服务器:
“最简单的部署策略是安装 eventlet 或 gevent,并通过调用 socketio.run(app) 启动 Web 服务器,如上面的示例所示。这将在 eventlet 或 gevent Web 服务器上运行应用程序,无论安装哪个。” (取自 Flask-SocketIO 文档)
可悲的是,这并不能解决问题。我以前从未使用过 websockets,所以我有点迷茫。这是我的代码的简化版本:
from flask import Flask
from flask_socketio import SocketIO, emit
import eventlet
app = Flask(__name__)
socketio = SocketIO(app)
@socketio.on("connect")
def handle_connect():
print("server and client connected")
@socketio.on("text")
def text(question):
for _ in range(3):
answer = my_module.generate_answer(question)
emit("message", {"msg": answer})
socketio.run(app)
假设 my_module.generate_answer() 根据通过 websocket 发送的一些用户输入生成一个句子。每一代需要5-10秒。这也是我希望在生成答案后通过 WebSocket 发送答案的原因——我的前端在等待下一个答案时已经可以显示第一个答案。
非常感谢你的帮助!
解决方案
您需要在文件的最顶部添加猴子补丁。
您的导入语句应如下所示:
import eventlet
eventlet.monkey_patch()
from flask import Flask
from flask_socketio import SocketIO, emit