Flask/LangChain/asyncio 应用中的 "Event loop is closed
背景。 我想同时运行几个大型语言模型(LLM)的请求。我正在使用Flask、LangChain和asyncio。Flask是安装了“async”扩展的。
问题。 每隔一秒钟(!)当应用处理请求时,我在终端上会看到以下提示,这个提示会重复出现,次数和分析列表中的项目数量一样:
ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-44' coro=<AsyncClient.aclose() done, defined at [path]\flask-server\venv\Lib\site-packages\httpx\_client.py:2011> exception=RuntimeError('Event loop is closed')>
[Traceback without references to application files]
RuntimeError: Event loop is closed
这个问题似乎并不严重,因为应用仍然会按预期发送响应。
问题:我该如何防止运行时错误?这里发生了什么?哪些事件循环在什么时刻被关闭,为什么这会成为一个问题?
代码
# logic
import asyncio
async def run_analyses(analyses):
tasks = []
for analysis in analyses:
task = asyncio.create_task(run_analysis(analysis))
tasks.append(task)
results = await asyncio.gather(*tasks)
return results
async def run_analysis(analysis):
messages = ...
llm = ChatAnthropic(...)
response = await llm.ainvoke(messages)
result = response.content
return result
# app.py using Flask
import asyncio
@app.route('/process', methods=['POST'])
async def process():
data = request.json
analyses = data['analyses']
results = await run_analyses(analyses)
return jsonify(results)
if __name__ == '__main__':
app.run(debug=True, port=5000)
我尝试过的事情
- 等待主应用的运行
- 使用和不使用asyncio.create_task
- 花了一个小时跟随GPT4的建议,但没有效果 :)
1 个回答
0
有些人专注于asgi这个东西。我建议你可以试试Quart。
这个框架和Flask很像,是为了满足Flask的需求而设计的,并且它是async
的,也就是说它可以同时处理多个请求,跟Flask的库也兼容。