为了解决Flask与LangGraph异步事件循环冲突问题("Event loop is closed"错误),我们将Flask应用改为使用ASGI适配器启动。这样可以获得真正的异步支持,允许LangGraph的checkpoint保存在请求完成后继续执行。
原本的错误:
redisvl.exceptions.RedisSearchError: Unexpected error while searching: Event loop is closed
这个错误发生在Flask路由处理完成后,LangGraph尝试异步保存checkpoint时事件循环已被关闭。
使用ASGI适配器(WsgiToAsgi
)将Flask WSGI应用包装为ASGI应用,然后使用uvicorn ASGI服务器运行,获得持久化事件循环支持。
# 进入项目目录
cd test/custom_react_agent
# 安装ASGI依赖
pip install uvicorn asgiref
# 或者安装所有依赖
pip install -r requirements.txt
cd test/custom_react_agent
python api.py
说明:
启动日志示例:
🚀 使用ASGI模式启动异步Flask应用...
这将解决事件循环冲突问题,支持LangGraph异步checkpoint保存
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
cd test/custom_react_agent
# 启动ASGI应用
uvicorn asgi_app:asgi_app --host 0.0.0.0 --port 8000
# 开发模式(自动重载)
uvicorn asgi_app:asgi_app --host 0.0.0.0 --port 8000 --reload
# 生产模式(多worker)
uvicorn asgi_app:asgi_app --host 0.0.0.0 --port 8000 --workers 4
如果ASGI依赖安装失败,会自动fallback到传统Flask模式:
⚠️ ASGI依赖缺失,使用传统Flask模式启动
建议安装: pip install uvicorn asgiref
传统模式可能存在异步事件循环冲突问题
启动后,可以测试API:
# 测试健康检查
curl http://localhost:8000/health
# 测试聊天API
curl -X POST http://localhost:8000/api/chat \
-H "Content-Type: application/json" \
-d '{
"user_id": "test_user",
"question": "请问下一届足球世界杯在哪里举行?"
}'
如果修复成功,您应该看到:
Q: ImportError: No module named 'uvicorn'
A: 运行 pip install uvicorn asgiref
Q: 启动时提示权限错误
A: 尝试更换端口:python api.py
或在代码中修改端口号
Q: 仍然出现异步错误 A: 检查是否真的使用了ASGI模式,查看启动日志确认
api.py
:主要API文件,包含自动ASGI启动逻辑asgi_app.py
:独立ASGI应用文件,用于uvicorn命令行启动requirements.txt
:所需依赖列表ASGI_启动说明.md
:本文档修复后的API调用应该像这样工作:
# 第一次请求
curl -X POST http://localhost:8000/api/chat -H "Content-Type: application/json" -d '{"user_id":"polo","question":"你好"}'
# ✅ 成功响应
# 第二次请求(之前会失败)
curl -X POST http://localhost:8000/api/chat -H "Content-Type: application/json" -d '{"user_id":"polo","question":"请问下一届足球世界杯在哪里举行?"}'
# ✅ 成功响应,无事件循环错误
如有问题,请检查启动日志和错误信息。