FastAPI中调用asyncio.run报错:无法从运行中事件循环调用
问题解决方法
核心问题
FastAPI的异步接口本身已经运行在asyncio事件循环中,asyncio.run()会尝试创建新的事件循环,因此触发asyncio.run() cannot be called from a running event loop错误。而直接用create_task返回的是协程/任务对象,必须通过await才能获取实际结果。
正确修改方案
把query函数改为异步函数,在FastAPI的异步接口中直接await调用它,全程复用FastAPI的事件循环即可:
修改controller.py:
在调用query时添加await,因为现在query是异步函数:@router.api_route() async def api_call(a,b): # 调用异步函数需要加await resp = await query(a,b) return resp修改query.py:
将query改为异步函数,直接await调用man,无需再用asyncio.run或手动创建任务:from database_call import man async def query(a,b): result = await man(a,b) return resultdatabase_call.py保持不变(修正变量笔误):
原有的异步HTTP请求逻辑是正确的,注意统一url变量的使用:import aiohttp async def man(a,b): async with aiohttp.ClientSession() as session: # 根据a、b生成实际Solr请求URL url = f"your_solr_collection_url?param_a={a}¶m_b={b}" async with session.get(url) as resp: result = await resp.json() return result
为什么之前的尝试失败?
- 用
asyncio.run():在已有事件循环的环境下不能创建新循环,直接报错。 - 用
loop.create_task():返回的是Task对象,不是实际结果,必须通过await task才能拿到数据;另外你代码里asyncio.get_event_loop少了括号,正确写法是asyncio.get_event_loop()。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

