Skip to main content

性能测试

函数是否都使用 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() 这种阻塞性的同步库,函数会失去异步的特质以同步阻塞的形式执行