自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASGI解釋:Python Web開發(fā)的未來

譯文
開發(fā) 前端
快進到2022年。Python2已經(jīng)過時,Python現(xiàn)在具有處理網(wǎng)絡(luò)調(diào)用等異步操作的原生語法。WSGI和其他默認假定同步行為的標準無法利用異步的性能和效率增益。這反過來又意味著WSGI不能有效地處理像WebSocket這樣的高級協(xié)議。

?譯者 | 李睿

審校 | 孫淑娟

Python Web應(yīng)用程序長期以來一直遵循Web服務(wù)器網(wǎng)關(guān)接口(WSGI)標準,該標準描述了它們?nèi)绾闻cWeb服務(wù)器通信。WSGI最初于2003年推出,并于2010年更新,僅依賴于Python2.2版本中原生可用的、易于實現(xiàn)的功能。因此, WSGI迅速融入了所有主要的Python Web框架,并成為Python Web開發(fā)的基石。

快進到2022年。Python2已經(jīng)過時,Python現(xiàn)在具有處理網(wǎng)絡(luò)調(diào)用等異步操作的原生語法。WSGI和其他默認假定同步行為的標準無法利用異步的性能和效率增益。這反過來又意味著WSGI不能有效地處理像WebSocket這樣的高級協(xié)議。

輸入ASGI,即異步服務(wù)器網(wǎng)關(guān)接口。與WSGI類似,ASGI描述了Python Web應(yīng)用程序和Web服務(wù)器之間的通用接口。與WSGI不同的是,ASGI允許每個應(yīng)用程序有多個異步事件。另外,ASGI支持同步和異步應(yīng)用程序。開發(fā)人員可以將原有的同步WSGI Web應(yīng)用程序遷移到ASGI,也可以使用ASGI構(gòu)建新的異步Web應(yīng)用程序。

1.WSGI的工作原理

WSGI的工作原理是向Web服務(wù)器公開Python函數(shù),通常命名為應(yīng)用程序或app。該函數(shù)采用兩個參數(shù):

  • environ:包含有關(guān)當前請求和Web服務(wù)器提供的環(huán)境變量的信息的字典。
  • start_response:將用于啟動將HTTP響應(yīng)發(fā)送回客戶端的函數(shù)。

函數(shù)返回的數(shù)據(jù)構(gòu)成響應(yīng)體。

一個簡單的應(yīng)用程序函數(shù)可能如下所示:?

def application(environ, start_response):

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

return [b'Greetings universe']

如果使用的是與WSGI兼容的Web框架(例如Flask),那么該框架本身將提供一個應(yīng)用程序功能,其所有組件將自動連接。

WSGI有兩個缺點:首先,WSGI一次只處理一個請求和響應(yīng),并假設(shè)響應(yīng)將立即返回。沒有辦法處理長時間保持的連接,例如WebSocket或長輪詢HTTP連接。

其次,WSGI只是同步的。即使使用多線程連接池,每個連接都會阻塞,直到它返回響應(yīng)。許多WSGI設(shè)置都能夠處理線程池和進程池,但這些都受到WSGI接口本身同步的限制。

2.ASGI的工作原理?

ASGI在外觀上與WSGI相似。與WSGI一樣,開發(fā)人員可以定義一個應(yīng)用程序函數(shù)對象,但它是一個帶有三個參數(shù)而不是兩個參數(shù)的異步函數(shù):

scope:包含有關(guān)當前請求的信息的字典,類似于WSGI中的environ,但細節(jié)的命名約定略有不同。

send:允許應(yīng)用程序?qū)⑾l(fā)送回客戶端的異步可調(diào)用函數(shù)。

receive:允許應(yīng)用程序從客戶端接收消息的異步可調(diào)用函數(shù)。

一個簡單的ASGI應(yīng)用程序函數(shù)如下所示:

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()函數(shù),并根據(jù)需要將其連接起來。

與ASGI最明顯的區(qū)別是,在整個函數(shù)中使用了異步隱喻。該函數(shù)本身是異步的,在此通過兩個單獨的await send( )命令發(fā)送HTTP標頭和響應(yīng)正文。這樣,函數(shù)本身及其發(fā)送命令就不會阻塞任何內(nèi)容;它們可以與應(yīng)用程序的調(diào)用交織在一起,并可以同時從許多其他連接發(fā)送。

在這個例子中沒有使用receive,但它也是一個異步函數(shù)。它讓在不阻塞其他操作的情況下接收請求正文。請求和響應(yīng)可以以這種方式增量地傳入或傳出服務(wù)器——這是無法很好地完成的事情,或者可能根本無法使用WSGI完成的。

3.在ASGI中使用同步和異步函數(shù)?

使用ASGI時,需要盡可能多地使用異步函數(shù)和異步友好庫。養(yǎng)成使用異步的習慣是值得的,因為使用僅同步代碼的問題可能很嚴重。任何對同步函數(shù)的長時間調(diào)用都會阻塞整個調(diào)用鏈,從而使使用異步的好處幾乎消失殆盡。

如果在使用長時間運行的同步調(diào)用時遇到問題,需要使用asyncio.run_in_executor將調(diào)用外包給線程池或進程池。每當?shù)却獠渴录蚍荂PU密集型任務(wù)時,都應(yīng)使用線程池。而進程池應(yīng)該用于CPU密集型的本地任務(wù)。

例如,Web應(yīng)用程序中有一個路由可以調(diào)用遠程網(wǎng)站,那么應(yīng)該使用線程?;蛘吒玫姆椒ㄊ牵褂冒l(fā)出異步HTTP請求的aiohttp庫。如果想調(diào)用Pillow圖像庫來調(diào)整圖像大小,可能應(yīng)該使用帶有進程池的run_in_executor。盡管在進程之間來回傳輸數(shù)據(jù)會有一些輕微的開銷,但使用run_in_executor不會阻塞其他事件。

4.支持ASGI的Web框架

通過實現(xiàn)application( )對象,可以人工編寫ASGI Web應(yīng)用程序。但絕大多數(shù)情況下,使用異步原生、以ASGI為中心的Python Web框架會更簡單。以下是一些常見的與ASGI兼容的Web框架:

Starlette和FastAPI:這些新興框架(FastAPI構(gòu)建在Starlette之上)都是異步優(yōu)先的,因此它們都支持ASGI也就不足為奇了。如果是從零開始開發(fā)Web應(yīng)用程序,那么它們是Python最現(xiàn)代和最前沿的Web框架。

Quart:雖然主要的Python Web框架Flask確實支持ASGI,但Flask的設(shè)計并不是從內(nèi)到外利用異步隱喻。來自GitLab的Quart使用Flask的語法和隱喻,但允許異步路由處理程序。

Django 3.0及更高版本:從Django3.0開始,久負盛名的Django Web框架支持ASGI。在Django 3.1中添加了對Django應(yīng)用程序中異步代碼的支持,而不是僅僅能夠在ASGI處理程序上掛載Django。對于一個不以執(zhí)行速度著稱的框架來說,異步的存在為那些選擇利用它的人帶來了更好的性能。

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

責任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2013-05-22 15:43:39

谷歌web組件web開發(fā)

2019-06-26 08:20:19

JavaScriptWeb開發(fā)

2014-12-09 14:07:50

2024-11-22 08:28:43

2011-02-21 09:10:42

WebHTML 5JavaScript

2020-04-01 10:48:45

Web開發(fā)LAMP

2010-08-09 08:48:46

File APIWeb

2021-06-15 18:44:21

Web3互聯(lián)網(wǎng)web 2.0

2011-01-10 10:16:12

最新Web開發(fā)技術(shù)

2009-10-28 10:18:52

GWTWeb開發(fā)

2022-11-29 17:08:03

開發(fā)Web客戶端

2014-04-18 09:31:04

PystonDropboxPython

2023-09-28 13:30:06

HtmxWebJavascript

2010-11-17 09:07:39

2009-09-09 09:55:56

Web開發(fā)PHP,Java和.N

2013-11-28 09:43:46

JavaScriptWeb

2022-01-05 08:58:08

Python解釋器編程語言

2015-08-10 15:02:09

Web設(shè)計趨勢

2012-04-11 09:46:40

Web App

2023-06-08 11:31:00

WebGPUWeb 平臺
點贊
收藏

51CTO技術(shù)棧公眾號