You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中调用asyncio.run报错:无法从运行中事件循环调用

问题解决方法

核心问题

FastAPI的异步接口本身已经运行在asyncio事件循环中,asyncio.run()会尝试创建新的事件循环,因此触发asyncio.run() cannot be called from a running event loop错误。而直接用create_task返回的是协程/任务对象,必须通过await才能获取实际结果。

正确修改方案

把query函数改为异步函数,在FastAPI的异步接口中直接await调用它,全程复用FastAPI的事件循环即可:

  1. 修改controller.py:
    在调用query时添加await,因为现在query是异步函数:

    @router.api_route()
    async def api_call(a,b):
         # 调用异步函数需要加await
         resp = await query(a,b)
         return resp
    
  2. 修改query.py:
    将query改为异步函数,直接await调用man,无需再用asyncio.run或手动创建任务:

    from database_call import man
    
    async def query(a,b):
        result = await man(a,b)
        return result
    
  3. database_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}&param_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:01:01