性能测试
函数是否都使用 async
from fastapi import APIRouter
import time
import asyncio
router = APIRouter()
@router.get("/a")
async def a():
time.sleep(1)
return {"message": "异步模式,但是同步执行sleep函数,执行过程是串行的"}
@router.get("/b")
async def b():
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, time.sleep, 1)
return {"message": "线程池中运行sleep函数"}
@router.get("/c")
async def c():
await asyncio.sleep(1)
return {"message": "异步模式,且异步执行sleep函数"}
@router.get("/d")
def d():
time.sleep(1)
return {"message": "同步模式,但是FastAPI会放在线程池中运行,所以很快"}
结果:
/a接口:100秒
/b接口:1秒
/c接口:1秒
/d接口:3秒
这个函数没有async修饰,即一个普通函数。 但是FastAPI会将函数放到thread pool中执行。
服务器是8核CPU,线程池的默认配置是核心数*5=40。 服务器在第一秒和第二秒分别处理40个请求,第三秒处理20个请求。
所以100个并发总耗时3秒。
总结
- 不添加async的同步函数会被以多线程的方式处理
- 对于添加了async的异步函数,
- 如果该函数完全基于异步编写,则会以异步的形式执行
- 如果使用了time.time() 这种阻塞性的同步库,函数会失去异步的特质以同步阻塞的形式执行