0

0

ASGI解释:Python Web开发的未来

WBOY

WBOY

发布时间:2023-04-12 22:37:03

|

1771人浏览过

|

来源于51CTO.COM

转载

​译者 | 李睿

审校 | 孙淑娟

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,但细节的命名约定略有不同。

Lateral App
Lateral App

整理归类论文

下载

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​

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

574

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

697

2023.08.11

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号