首页 > 解决方案 > 使用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 发送答案的原因——我的前端在等待下一个答案时已经可以显示第一个答案。

非常感谢你的帮助!

标签: pythonflaskwebsocketbackend

解决方案


您需要在文件的最顶部添加猴子补丁。

您的导入语句应如下所示:

import eventlet
eventlet.monkey_patch()

from flask import Flask
from flask_socketio import SocketIO, emit

推荐阅读