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程序
Apr 04 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
在python中画正态分布图像的实例
Jul 08 Python
Python API自动化框架总结
Nov 12 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
Python面向对象编程基础实例分析
Jan 17 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python 如何调用 dubbo 接口
Sep 24 Python
python如何查找列表中元素的位置
May 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
Javascript的闭包
2009/12/31 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
js回调函数仿360开机
2019/12/26 Javascript
老生常谈Python序列化和反序列化
2017/06/28 Python
python实现猜单词小游戏
2020/05/22 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
五年级科学教学反思
2014/02/05 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
通知怎么写?
2019/04/17 职场文书
python删除csv文件的行列
2021/04/06 Python
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
nginx 配置缓存
2022/05/11 Servers