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简单实现基于SSL的IRC bot实例
Jun 15 Python
简单谈谈python的反射机制
Jun 28 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
python如何在循环引用中管理内存
Mar 20 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
python学生信息管理系统(完整版)
Apr 05 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
django的settings中设置中文支持的实现
Apr 28 Python
python中shell执行知识点
May 06 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 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初学者头痛的十四个问题
2006/07/12 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
python str与repr的区别
2013/03/23 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Python中按键来获取指定的值
2019/03/02 Python
python实现logistic分类算法代码
2020/02/28 Python
python 监控logcat关键字功能
2020/09/04 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
文明学生标兵事迹
2014/01/21 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
HttpClient实现文件上传功能
2022/08/14 Java/Android