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

FastAPI异步函数调用内部端点请求挂起,如何传递参数?

FastAPI异步函数调用内部端点挂起的解决方法

你遇到的请求挂起问题,核心原因是**requests.get是同步阻塞IO操作**——FastAPI的异步函数运行在单线程事件循环中,同步IO会占据整个事件循环,导致内部的/data端点请求无法被处理,最终陷入死锁。

下面是两种可行的解决方案:

方案一:使用异步HTTP客户端(httpx)

替换同步的requests为异步的httpx.AsyncClient,避免阻塞事件循环:

from fastapi import FastAPI, Query
from typing import List
import httpx

app = FastAPI()

@app.get('/data')
async def test_data(nums: List[int] = Query(...)):
    return [num * 2 for num in nums]

@app.get('/load_data')
async def load_data(nums: List[int] = Query(...)):
    async with httpx.AsyncClient() as client:
        # 用params参数自动构造查询字符串,避免手动拼接的冗余&符号
        response = await client.get('http://127.0.0.1:8000/data', params={'nums': nums})
        return response.json()

方案二:直接调用端点函数(更高效)

既然两个端点属于同一个应用,没必要走HTTP请求,直接调用对应的异步函数即可,性能更优:

from fastapi import FastAPI, Query
from typing import List

app = FastAPI()

@app.get('/data')
async def test_data(nums: List[int] = Query(...)):
    return [num * 2 for num in nums]

@app.get('/load_data')
async def load_data(nums: List[int] = Query(...)):
    # 直接调用内部函数,跳过HTTP请求流程
    return await test_data(nums)

额外注意

  • 手动拼接URL时最后会多一个&符号,虽然多数客户端能兼容,但用params自动构造查询字符串更规范。
  • 异步函数内绝对不能使用同步IO操作(如requests、time.sleep),会直接阻塞整个服务的事件循环。

内容的提问来源于stack exchange,提问作者codeweird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:36:32