Flask/LangChain/asyncio 应用中的 "Event loop is closed

-1 投票
1 回答
79 浏览
提问于 2025-04-14 17:50

背景。 我想同时运行几个大型语言模型(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的库也兼容。

撰写回答