我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ASGI解释:Python Web开发的未来

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ASGI解释:Python Web开发的未来

​译者 | 李睿

审校 | 孙淑娟

Python Web应用程序长期以来一直遵循Web服务器网关接口(WSGI)标准,该标准描述了它们如何与Web服务器通信。WSGI最初于2003年推出,并于2010年更新,仅依赖于Python2.2版本中原生可用的、易于实现的功能。因此, WSGI迅速融入了所有主要的Python Web框架,并成为Python Web开发的基石。

快进到2022年。Python2已经过时,Python现在具有处理网络调用等异步操作的原生语法。WSGI和其他默认假定同步行为的标准无法利用异步的性能和效率增益。这反过来又意味着WSGI不能有效地处理像WebSocket这样的高级协议。

输入ASGI,即异步服务器网关接口。与WSGI类似,ASGI描述了Python Web应用程序和Web服务器之间的通用接口。与WSGI不同的是,ASGI允许每个应用程序有多个异步事件。另外,ASGI支持同步和异步应用程序。开发人员可以将原有的同步WSGI Web应用程序迁移到ASGI,也可以使用ASGI构建新的异步Web应用程序。

1.WSGI的工作原理

WSGI的工作原理是向Web服务器公开Python函数,通常命名为应用程序或app。该函数采用两个参数:

  • environ:包含有关当前请求和Web服务器提供的环境变量的信息的字典。
  • start_response:将用于启动将HTTP响应发送回客户端的函数。

函数返回的数据构成响应体。

一个简单的应用程序函数可能如下所示:​

def application(environ, start_response):

 start_response('200 OK', [('Content-Type', 'text/plain')])

 return [b'Greetings universe']

如果使用的是与WSGI兼容的Web框架(例如Flask),那么该框架本身将提供一个应用程序功能,其所有组件将自动连接。

WSGI有两个缺点:首先,WSGI一次只处理一个请求和响应,并假设响应将立即返回。没有办法处理长时间保持的连接,例如WebSocket或长轮询HTTP连接。

其次,WSGI只是同步的。即使使用多线程连接池,每个连接都会阻塞,直到它返回响应。许多WSGI设置都能够处理线程池和进程池,但这些都受到WSGI接口本身同步的限制。

2.ASGI的工作原理​

ASGI在外观上与WSGI相似。与WSGI一样,开发人员可以定义一个应用程序函数对象,但它是一个带有三个参数而不是两个参数的异步函数:

scope:包含有关当前请求的信息的字典,类似于WSGI中的environ,但细节的命名约定略有不同。

send:允许应用程序将消息发送回客户端的异步可调用函数。

receive:允许应用程序从客户端接收消息的异步可调用函数。

一个简单的ASGI应用程序函数如下所示:

async def application(scope, receive, send):
 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!',
 })

与WSGI Web框架一样,ASGI Web框架将生成自己的application()函数,并根据需要将其连接起来。

与ASGI最明显的区别是,在整个函数中使用了异步隐喻。该函数本身是异步的,在此通过两个单独的await send( )命令发送HTTP标头和响应正文。这样,函数本身及其发送命令就不会阻塞任何内容;它们可以与应用程序的调用交织在一起,并可以同时从许多其他连接发送。

在这个例子中没有使用receive,但它也是一个异步函数。它让在不阻塞其他操作的情况下接收请求正文。请求和响应可以以这种方式增量地传入或传出服务器——这是无法很好地完成的事情,或者可能根本无法使用WSGI完成的。

3.在ASGI中使用同步和异步函数​

使用ASGI时,需要尽可能多地使用异步函数和异步友好库。养成使用异步的习惯是值得的,因为使用仅同步代码的问题可能很严重。任何对同步函数的长时间调用都会阻塞整个调用链,从而使使用异步的好处几乎消失殆尽。

如果在使用长时间运行的同步调用时遇到问题,需要使用asyncio.run_in_executor将调用外包给线程池或进程池。每当等待外部事件或非CPU密集型任务时,都应使用线程池。而进程池应该用于CPU密集型的本地任务。

例如,Web应用程序中有一个路由可以调用远程网站,那么应该使用线程。或者更好的方法是,使用发出异步HTTP请求的aiohttp库。如果想调用Pillow图像库来调整图像大小,可能应该使用带有进程池的run_in_executor。尽管在进程之间来回传输数据会有一些轻微的开销,但使用run_in_executor不会阻塞其他事件。

4.支持ASGI的Web框架

通过实现application( )对象,可以人工编写ASGI Web应用程序。但绝大多数情况下,使用异步原生、以ASGI为中心的Python Web框架会更简单。以下是一些常见的与ASGI兼容的Web框架:

Starlette和FastAPI:这些新兴框架(FastAPI构建在Starlette之上)都是异步优先的,因此它们都支持ASGI也就不足为奇了。如果是从零开始开发Web应用程序,那么它们是Python最现代和最前沿的Web框架。

Quart:虽然主要的Python Web框架Flask确实支持ASGI,但Flask的设计并不是从内到外利用异步隐喻。来自GitLab的Quart使用Flask的语法和隐喻,但允许异步路由处理程序。

Django 3.0及更高版本:从Django3.0开始,久负盛名的Django Web框架支持ASGI。在Django 3.1中添加了对Django应用程序中异步代码的支持,而不是仅仅能够在ASGI处理程序上挂载Django。对于一个不以执行速度著称的框架来说,异步的存在为那些选择利用它的人带来了更好的性能。

原文链接:https://www.infoworld.com/article/3658336/asgi-explained-the-future-of-python-Web-development.html​

以上就是ASGI解释:Python Web开发的未来的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ASGI解释:Python Web开发的未来

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript MVVM 架构:Web 开发的未来?

JavaScript MVVM 架构是一种强大的模式,它将视图、模型和视图模型分离,从而简化了 Web 应用程序的开发。通过使用 MVVM,开发人员可以更快地构建和维护交互式用户界面。
JavaScript MVVM 架构:Web 开发的未来?
2024-03-03

JavaScript MVVM 架构:塑造 Web 开发未来的关键

JavaScript MVVM 架构是一种现代化的 Web 开发模式,它通过双向数据绑定和可观察性实现了 UI 和数据的自动同步。它简化了复杂应用程序的开发,提高了代码的可维护性和应用程序的响应速度。
JavaScript MVVM 架构:塑造 Web 开发未来的关键
2024-03-03

C++在Web开发领域的未来趋势是什么?

c++++ 在 web 开发中前景光明,特别是在高性能 web 服务、实时应用程序、前端和后端集成、嵌入式 web 服务器等领域,其强大的性能、低延迟和嵌入式功能使其成为构建复杂 web 解决方案的关键选择。如代码示例所示,使用 asio
C++在Web开发领域的未来趋势是什么?
2024-05-11

ASP对象与组件的未来:展望Web开发的新时代

ASP对象和组件的未来:将复杂的业务逻辑分解成可重用的组件,以便于维护和扩展。
ASP对象与组件的未来:展望Web开发的新时代
2024-02-26

Dropbox正开发的开源Python 解释器Pyston的实例分析

这期内容当中小编将会给大家带来有关Dropbox正开发的开源Python 解释器Pyston的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。大家好,我非常激动宣布 Pyston,这是一个正在由 D
2023-06-17

如何理解WEB开发中的Python WSGI协议

今天就跟大家聊聊有关如何理解WEB开发中的Python WSGI协议,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Web应用程序开发Web应用程序的本质是什么简单描述Web应用程序的
2023-06-02

Web开发中遇到的Python问题及解决方法

Web开发中遇到的Python问题及解决方法随着互联网的迅猛发展,Web开发变得越来越重要。而Python作为一种功能强大、易于学习的编程语言,成为了Web开发的首选语言之一。然而,在Python的Web开发过程中,会遇到各种各样的问题。本
2023-10-22

Node.js CommonJS 规范的未来展望:新特性解析,领略模块化开发新风尚

Node.js CommonJS 规范是 JavaScript 语言在 Node.js 平台上的模块化开发规范。它定义了模块的加载、执行和交互方式,是 Node.js 开发中不可或缺的一部分。
Node.js CommonJS 规范的未来展望:新特性解析,领略模块化开发新风尚
2024-02-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录