Flask+OpenAI集成Flask-SocketIO流式返回异常求助
Flask-SocketIO 结合 OpenAI 流式返回批量发送问题解决方案
核心原因
你的代码无法实时推送流式内容,大概率是以下两个问题导致:
- 同步阻塞导致 SocketIO 消息被缓冲,无法实时推送
- OpenAI API 调用未正确开启流式返回
分步解决
1. 确认 OpenAI 流式返回已启用
检查 company_research.get_company_chat 内部调用 OpenAI ChatCompletion API 时,是否明确设置了 stream=True 参数。如果未开启该参数,API 会一次性返回完整结果,自然无法实现流式推送。
2. 切换为异步处理模式
同步处理函数会阻塞事件循环,导致 SocketIO 无法实时发送消息。将处理函数改为异步,并使用 await 调用 socketio.send:
@socketio.on("chat", namespace=namespace) async def company_chat(data: list): print(f"I'm in function: {inspect.currentframe().f_code.co_name}") try: request_json = RequestCompanyChat(**data) results = company_research.get_company_chat( request_json.locale, request_json.company_name, request_json.messages ) for chunk in results: content = chunk.choices[0].delta.content or "" await socketio.send( ResponseCompanySearch(content=content).model_dump_json(), namespace=namespace, to=request.sid, ) print(content, end="") # 强制触发上下文切换,确保消息实时推送 await socketio.sleep(0) await socketio.send("end", namespace=namespace, to=request.sid) except Exception as e: print(e) import traceback traceback.print_exc() await socketio.send(f"An error occurred: {str(e)}", namespace=namespace)
3. 配置异步服务器
确保 Flask-SocketIO 使用异步服务器(如 eventlet)启动,否则异步函数无法正常运行:
from flask import Flask from flask_socketio import SocketIO import eventlet eventlet.monkey_patch() app = Flask(__name__) socketio = SocketIO(app, async_mode='eventlet') # 后续路由和事件注册... if __name__ == '__main__': socketio.run(app, debug=True)
4. 同步模式下的临时修复
如果暂时无法切换异步,可在每次 socketio.send 后添加 socketio.sleep(0),强制释放事件循环,让消息实时推送:
# 同步函数中的循环部分 for chunk in results: content = chunk.choices[0].delta.content or "" socketio.send( ResponseCompanySearch(content=content).model_dump_json(), namespace=namespace, to=request.sid, ) print(content, end="") # 触发上下文切换 socketio.sleep(0)
额外检查
- 客户端需确保实时处理收到的 SocketIO 消息,避免在客户端缓存消息后一次性渲染
- 确认网络环境无延迟或代理导致的消息堆积
内容的提问来源于stack exchange,提问作者An-Tran
相关产品推荐
相关产品推荐

