赞
踩
从本教程开篇,我们就说FastAPI这个web框架是异步框架,那它到底是如何体现异步的呢?
想要学习使如何使用FastAPI的异步功能,那就必须要先了解什么是异步,什么是asyncio、async/await
【基础补充】
关于异步编程、协程实行的异步编程的基础知识
【重要结论】
本质上,实现异步的方式有三种:多进程、多线程和协程,FastAPI实现异步使用了多线程(线程池)和协程的方式。
def
定义路径函数,FastAPI内部帮我们使用多线程(线程池)实现异步并发async def
定义路径函数,FastAPI内部使用协程的方式实现异步并发。在FastAPI中可以使用普通函数定义的接口,也可以使用async def 实行定义的接口。但是使用是需要注意,否则会导致程序极慢。
示例1:普通函数形式定义的接口,会按照多线程(线程池)的方式异步执行
time.sleep(5)
模拟耗时5simport time
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def index():
time.sleep(5)
return "index"
示例2:async def 形式的定义的接口,使用单线程协程的形式异步执行
因为使用了协程的方式,当有两个客户端发请求时,单线程内代码块级别的切换,最终5秒后两个客户端都会得到响应。
注意:协程时不能使用同步阻塞的time模块,需要使用asyncio.sleep()。又因为它是协程对象,所以需要使用await
才能被执行。
另外,await
必须使用在async
定义的函数内,否则报错。
同时注意,在async def 内部不能使用同步模块,否则就会编程单线程同步执行的方式。
import asyncio
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
await asyncio.sleep(5)
return "index"
示例3:在协程函数内错误使用同步模块
import time
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
time.sleep(5) # 不能在async def 函数内使用同步阻塞模块。
return "index"
【注意】
FastAPI非常灵活,支持你写普通的函数,也支持你写async def 形式的函数,那到底该如何选择?
下面有几个原则,可以帮助大家做选择:
def
@app.get('/')
def results():
results = some_library()
return results
await
调用时,此时使用 async def</
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。