当前位置:主页 > 软件编程 > Python代码 >

python异步的ASGI与Fast Api实现

时间:2022-03-13 12:55:47 | 栏目:Python代码 | 点击:

Asgi是异步通信服务规范。客户端发起服务呼叫,但不等待结果。调用方立即继续其工作,并不关心结果。如果调用方对结果感兴趣,有一些机制可以让其随时被回调方法返回结果。

ASGI尝试保持在一个简单的应用接口的前提下,提供允许数据能够在任意的时候、被任意应用进程发送和接受的抽象。并且同样描述了一个新的,兼容HTTP请求响应以及WebSocket数据帧的序列格式。允许这些协议能通过网络或本地socket进行传输,以及让不同的协议被分配到不同的进程中。

#Asgi example  
 async def application(scope, receive, send):  
  event = await receive()  
      ...   
    await send({"type": "websocket.send", ...})

ASGI框架

您可以使用 Uvicorn,Daphne 或 Hypercorn 运行任何 ASGI 框架

对于小型服务,您也可以直接编写 ASGI 应用程序。例如之前编写的异步框架。

Python 中有以下几个支持 ASGI 的异步框架

Starlette
Starlette 是一个轻量级的 ASGI 框架/工具包。它是构建高性能异步服务的理想选择,并且支持 HTTP 和 WebSockets。

Django Channels
ASGI 规范最初是设计就是用于 Django Channels 的。
Channels 与其他ASGI框架略有不同,它在线程框架后端上提供了异步前端。
同时 Django Channels 支持 WebSocket,后台任务和长期运行的连接,而应用程序代码仍在标准线程上下文中运行

Quart
Quart 是一个类似于 Flask 的 ASGI Web 框架。Quart 不仅与 Flask 相似,而且与 Flask API 兼容!
该框架的作者希望保留了Flask 的风格,只是向其中添加异步、WebSocket 和 HTTP 2支持。
因此,你可以从 Flask 文档中学习 Quart 的用法,只需要记住 Quart 中的函数是异步的就行。

一个简单的 Quart 服务:

from quart import Quart
app = Quart(name)
@app.route('/')
async def hello():
return 'hello'app.run()

和 Flask 是不是很像,只是多了一个异步 async
由于 Quart 是从 Flask 中演进过来的,因此 Flask 的所有功能均可用:路由,中间件,会话,模板,蓝图等

ASGI服务器

Uvicorn 是一个快速的 ASGI 服务器,Uvicorn 是基于 uvloop 和 httptools 构建的,是 Python 异步生态中重要的一员。
Uvicorn 当前支持 HTTP / 1.1 和 WebSockets,将来计划支持HTTP / 2。
版本要求 Python 3.5 以上,Uvicorn 的安装,

pip install uvicorn

示例如下:

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ]
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })

运行命令如下,

uvicorn demo:app
服务启动之后,我们通过浏览器就能方位该服务,默认端口 8000

Daphne
Daphne 服务器是最早为 Django Channels 提供支持的 ASGI 服务器
Daphne 它在生产中广泛运行,并支持HTTP / 1.1,HTTP / 2和 WebSockets。

安装和运行的命令如下:

pip install daphne  daphne app:App和 uvicorn 命令类似,app 是文件名称,APP 是应用程序

Hypercorn
Hypercorn 最初是框架 Quart 的一部分,然后被分离为独立的 ASGI 服务器
同样的,Hypercorn 支持 HTTP/1.1, HTTP/2, 以及 WebSockets.
安装和运行的命令如下:
pip install hypercorn hypercorn app:App

FastAPI

FastAPI 是一个基于 Starlette 和 Pydantic 的 API 框架,其灵感来自以前的 APISta 服务器版本
使用 Python 3.6+ 类型声明编写 API 函数参数,并获得自动数据转换,数据验证。
FastApi 最主要的特点是快,非常高的性能,向 NodeJS 和 Go 看齐,现有最快的Python框架之一
同时它可以自动生成交互式 API 文档 UI,编写 API 接口后,你就可以使用符合标准的 UI 如 SwaggerUI,ReDoc 等来使用 API。

其特点如下:

示例如下:

先安装依赖的库

pip install fastapi
pip install uvicorn
import uvicorn
from fastapi import FastAPI

# 类似于 app = Flask(__name__)
app = FastAPI()

# 绑定路由和视图函数
@app.get("/")
async def root():
    return {"message": "Hi juejin"}

# 在 Windows 中必须加上 if __name__ == "__main__",否则会抛出 RuntimeError: This event loop is already running
if __name__ == '__main__':
    # 启动服务,因为我们这个文件叫做 main.py,所以需要启动 main.py 里面的 app
    # 第一个参数 "main:app" 就表示这个含义,然后是 host 和 port 表示监听的 ip 和端口
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

FastAPI 的几大功能:类型检查、自动 swagger UI、支持 asyncio、强大的依赖注入系统

总结

性能提升注: 以下针对生产环境的大型项目而言fastapi利用异步和轻量级的特点,大大提升了性能。但异步应用到实际中,并不是一件容易的事。fastapi的异步不算难写,逻辑不复杂的话,闭着眼睛加几个await很简单。但如果涉及到复杂系统。一处异步,处处异步。到底要不要用可能就见仁见智了。轻量级同时也代表着和flask一样,很多东西需要自己diy。而不是像django一样一站式解决。所以fastapi可能逐渐接过flask的位置,但还是难以对django发起挑战。最重要的一点还是,选了python作为后端。可能打一开始就不是对性能有多敏感。而是看中python的开发效率和生态。如果从兼顾开发效率+性能的角度出发,那么fastapi极大程度上会遇到来自go的强力竞争。只有再兼顾上python现有生态,fastapi才会有很大的优势。我们可以假想一个现有python项目,遇到了性能瓶颈,但不想脱离python的环境,或者不想承受更换语言的成本。那么fastapi是个很好的未来。

API文档、类型检测以及依赖注入fastapi完全拥抱了typing类型系统,高度整合了openapi(swagger ui),正如他的名字一样fastapi,从api开发的角度来说,无论是性能还是开发效率,它都足够“fast”。为api文档提供了非常多的支持。无需任何配置,后端只要把endpoint写出来,一份详尽的api文档就会自动生成。对于小型项目来说绝对是巨大优势。类型检测和依赖注入是api文档的基石 ,它们重点在于围绕框架的“感知力”。inspect抓endpoint的参数,明确的知道每个api接口需要什么,返回什么。这会让你感觉这个框架真的很有灵性。对于这方面我个人绝对是赞不绝口的。

简单与简洁会用flask就会fastapi,fastapi的学习曲线十分平滑。从下至上有很多值得学习参透的。非常建议有空的同学过一遍starlette,uvicorn,fastapi的源码。加起来也没有django多。

相关生态和社区还未成熟python的异步发展略为缓慢,仅仅fastapi还不能撑起一片天。例如现在还没有完全可靠的异步orm。不少东西还需要自己造轮子。在小项目上,这可能影响不是很大。直接写代码可能比配置插件来的快。但将很大程度上影响它被采用到线上生产环境。总结你可以将fastapi看成新出炉的flask plus。如果你有采用flask的理由,那么你同样有将来采用fastapi的理由。

您可能感兴趣的文章:

相关文章