在FastAPI中,async实际上是做什么的?

3

我有两个脚本:

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/")
async def root():
    a = await asyncio.sleep(10)
    return {'Hello': 'World',}

第二个:

from fastapi import FastAPI
import time
  
app = FastAPI()

@app.get("/")
def root():
    a = time.sleep(10)
    return {'Hello': 'World',}

请注意第二个脚本没有使用async。两个脚本都是一样的,起初我认为async脚本的好处在于它允许同时进行多个连接,但是当测试第二个代码时,我也能够运行多个连接。结果是相同的,性能也是相同的,我不明白为什么我们要使用async方法。感谢您的解释。

这个回答解决了你的问题吗?FastAPI以串行而非并行方式运行api调用 - Chris
2个回答

1

FastAPI文档:

您可以在路径操作函数中混合使用def和async def,根据需要为每个函数定义最佳选项。FastAPI将对它们进行正确处理。

无论如何,在上述任何情况下,FastAPI仍将异步工作,并且非常快速。

两个端点都将异步执行,但如果您异步定义端点函数,则可以使用await关键字并使用异步第三方库。


1

两个其他答案中缺少的是为什么在您的第二个示例中,API 仍然可以处理多个同时请求。原因可以在FastAPI 文档的此部分中找到:

当您使用普通的 def 而不是 async def 声明路径操作函数时,它会在外部线程池中运行,然后等待,而不是直接调用(因为这会阻塞服务器)。

这意味着所有您的 def 端点都在单独的线程中运行,这就是 API 可以并行化的原因。

那么如果存在此功能,为什么要使用异步呢?您可以阅读例如本文比较线程和异步,但总结起来,线程具有更多的开销,并且每个线程仍然被 IO(例如外部 API 或数据库调用)阻塞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接