python异步的ASGI与Fast Api实现


Posted in Python onJuly 16, 2021

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。

其特点如下:

  • 快速:拥有非常高的性能,归功于 Starlette 和 Pydantic;Starlette 用于路由匹配,Pydantic 用于数据验证
  • 开发效率:功能开发效率提升 200% 到 300%
  • 减少 bug:减少 40% 的因为开发者粗心导致的错误
  • 智能:内部的类型注解非常完善,编辑器可处处自动补全
  • 简单:框架易于使用,文档易于阅读
  • 简短:使代码重复最小化,通过不同的参数声明实现丰富的功能
  • 健壮:可以编写出线上使用的代码,并且会自动生成交互式文档
  • 标准化:兼容 API 相关开放标准
  • 它使用了 Python 的类型注解

示例如下:

先安装依赖的库

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的理由。

到此这篇关于python异步的ASGI与Fast Api实现的文章就介绍到这了,更多相关python异步的ASGI与Fast Api内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
让Python代码更快运行的5种方法
Jun 21 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
Python列表的切片实例讲解
Aug 20 Python
django 简单实现登录验证给你
Nov 06 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Flask使用SQLAlchemy实现持久化数据
Jul 16 #Python
Python多个MP4合成视频的实现方法
Jul 16 #Python
Python如何解决secure_filename对中文不支持问题
利用Matlab绘制各类特殊图形的实例代码
Flask response响应的具体使用
Python 快速验证代理IP是否有效的方法实现
Jul 15 #Python
You might like
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
利用php输出不同的心形图案
2016/04/22 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python按照多个条件排序的方法
2019/02/08 Python
python如何实现代码检查
2019/06/28 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
Python 求向量的余弦值操作
2021/03/04 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
制冷与电控专业应届生求职信
2013/11/11 职场文书
客房主管岗位职责
2013/12/09 职场文书
关爱老人标语
2014/06/21 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
金秋助学感谢信
2015/01/21 职场文书
党课主持词大全
2015/06/30 职场文书