
文章插圖
你是否聽到人們說過,異步 Python 代碼比“普通(或同步)Python 代碼更快?果真是那樣嗎?
“同步”和“異步”是什么意思?Web 應用程序通常要處理許多請求,這些請求在很短的時間段內(nèi)來自不同的客戶端 。為避免處理延遲,必須考慮并行處理多個請求,這通常稱為“并發(fā)” 。
在本文中,我將繼續(xù)使用 Web 應用程序作為例子,但是要記住還有其它類型的應用程序也從并發(fā)完成多個任務中獲益,因此這個討論并不僅僅是針對 Web 應用程序的 。
術語“同步”和“異步”指的是編寫并發(fā)應用程序的兩種方式 。所謂的“同步”服務器使用底層操作系統(tǒng)支持的線程和進程來實現(xiàn)這種并發(fā)性 。下面是同步部署的一個示意圖:

文章插圖
在這種情況下,我們有 5 臺客戶端,都向應用程序發(fā)送請求 。這個應用程序的訪問入口是一個 Web 服務器,通過將服務分配給一個服務器 worker 池來充當負載均衡器,這些 worker 可以實現(xiàn)為進程、線程或者兩者的結(jié)合 。這些 worker 執(zhí)行負載均衡器分配給他們的請求 。你使用 Web 應用程序框架(百思特網(wǎng)例如 Flask 或 Django)編寫的應用程序邏輯運行在這些 worker 中 。
這種類型的方案對于有多個 CPU 的服務器比較好,因為你可以將 worker 的數(shù)量設置為 CPU 的數(shù)量,這樣你就能均衡地利用你的處理器核心,而單個 Python 進程由于全局解釋器鎖(GIL)的限制無法實現(xiàn)這一點 。
在缺點方面,上面的示意圖也清楚展示了這種方案的主要局限 。我們有 5 個客戶端,卻只有 4 個 worker 。如果這 5 個客戶端在同一時間都發(fā)送請求,那么負載均衡器會將某一個客戶端之外的所有請求發(fā)送到 worker 池,而剩下的請求不得不保留在一個隊列中,等待有 worker 變得可用 。因此,五分之四的請求會立即響應,而剩下的五分之一需要等一會兒 。服務器優(yōu)化的一個關鍵就在于選擇適當數(shù)量的 worker 來防止或最小化給定預期負載的請求阻塞 。
一個異步服務器的配置很難畫,但是我會盡力而為:

文章插圖
這種類型的服務器運行在單個進程中,通過循環(huán)控制 。這個循環(huán)是一個非常有效率的任務管理器和調(diào)度器,創(chuàng)建任務來執(zhí)行由客戶端發(fā)送的請求 。與長期存在的服務器 worker 不同,異步任務是由循環(huán)創(chuàng)建,用來處理某個特定的請求,當那個請求完成時,該任務也會被銷毀 。任何時候,一臺異步服務器都會有上百或上千個活躍的任務,它們都在循環(huán)的管理下執(zhí)行自己的工作 。
你可能想知道異步任務之間的并行是如何實現(xiàn)的 。這就是有趣的部分,因為一個異步應用程序通過唯一的協(xié)同多任務處理來實現(xiàn)這點 。這意味著什么?當一個任務需要等待一個外部事件(例如,一個數(shù)據(jù)庫服務器的響應)時,不會像一個同步的 worker 那樣等待,而是會告訴循環(huán)它需要等待什么,然后將控制權(quán)返回給它 。循環(huán)就能夠在這個任務被數(shù)據(jù)庫阻塞的時候發(fā)現(xiàn)另外一個準備就緒的任務 。最終,數(shù)據(jù)庫將發(fā)送一個響應,而那時循環(huán)會認為第一個的任務已經(jīng)準備好再次運行,并將盡快恢復它 。
異步任務暫停和恢復執(zhí)行的這種能力可能在抽象上很難理解 。為了幫助你應用到你已經(jīng)知道的東西,可以考慮在 Python 中使用await或yield關鍵字這一方法來實現(xiàn),但你之后會發(fā)現(xiàn)這并不是唯一實現(xiàn)異步任務的方法 。
以上關于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 起步絕不會熄火的訣竅 熄火是什么
- 一些風水常識 風水是什么
- 我的火花可能是 火花是什么
- 單推是什么意思 推是什么意思
- 子陽名字的含義是什么 子的意思是什么
- 解說2者區(qū)別與聯(lián)系 無線ap和路由器的區(qū)別是什么
- 規(guī)格是什么意思?跟型號有區(qū)別嗎? 型號是什么意思
- 朝著目標努力的好句子 目標是什么意思
- 什么叫插排 插座是什么
- 大學生簽三方協(xié)議注意事項 三方是什么
