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
相关产品推荐
相关产品推荐

