精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

異步Python比同步Python快在哪里?

開發 后端
你是否聽人們說過,異步 Python 代碼比“普通(或同步)Python 代碼更快?果真是那樣嗎?來看看吧。

 你是否聽人們說過,異步 Python 代碼比“普通(或同步)Python 代碼更快?果真是那樣嗎?

1. “同步”和“異步”是什么意思?

Web 應用程序通常要處理許多請求,這些請求在短時間內來自不同的客戶端。為避免處理延遲,必須考慮并行處理多個請求,這通常稱為“并發”。

在本文中,我將繼續使用 Web 應用程序作為例子,但還有其它類型的應用程序也從并發中獲益。因此,這個討論并不僅僅是針對 Web 應用程序的。

術語“同步”和“異步”指的是編寫并發應用程序的兩種方式。所謂的“同步”服務器使用底層操作系統支持的線程和進程來實現這種并發性。下面是同步部署的一個示意圖:

在這種情況下,我們有 5 臺客戶端,都向應用程序發送請求。這個應用程序的訪問入口是一個 Web 服務器,通過將服務分配給一個服務器 worker 池來充當負載均衡器,這些 worker 可以實現為進程、線程或者兩者的結合。這些 worker 執行負載均衡器分配給他們的請求。你使用 Web 應用程序框架(例如 Flask 或 Django)編寫的應用程序邏輯運行在這些 worker 中。

這種類型的方案對于有多個 CPU 的服務器比較好,因為你可以將 worker 的數量設置為 CPU 的數量,這樣你就能均衡地利用你的處理器核心,而單個 Python 進程由于全局解釋器鎖(GIL)的限制無法實現這一點。

在缺點上,上面的示意圖也清楚展示了這種方案的主要局限。我們有 5 個客戶端,卻只有 4 個 worker。如果這 5 個客戶端在同一時間都發送請求,那么負載均衡器會將某一個客戶端之外的所有請求發送到 worker 池,而剩下的請求不得不保留在一個隊列中,等待有 worker 變得可用。因此,五分之四的請求會立即響應,而剩下的五分之一需要等一會兒。服務器優化的一個關鍵就在于選擇適當數量的 worker 來防止或最小化給定預期負載的請求阻塞。

一個異步服務器的配置很難畫,但是我盡力而為:

這種類型的服務器運行在單個進程中,通過循環控制。這個循環是一個非常有效率的任務管理器和調度器,創建任務來執行由客戶端發送的請求。與長期存在的服務器 worker 不同,異步任務是由循環創建,用來處理某個特定的請求,當那個請求完成時,該任務也會被銷毀。任何時候,一臺異步服務器都會有上百或上千個活躍的任務,它們都在循環的管理下執行自己的工作。

你可能想知道異步任務之間的并行是如何實現的。這就是有趣的部分,因為一個異步應用程序通過唯一的協同多任務處理來實現這點。這意味著什么?當一個任務需要等待一個外部事件(例如,一個數據庫服務器的響應)時,不會像一個同步的 worker 那樣等待,而是會告訴循環,它需要等待什么,然后將控制權返回給它。循環就能夠在這個任務被數據庫阻塞的時候發現另外一個準備就緒的任務。最終,數據庫將發送一個響應,而那時循環會認為第一個的任務已經準備好再次運行,并將盡快恢復它。

異步任務暫停和恢復執行的這種能力可能在抽象上很難理解。為了幫你應用到你已經知道的東西,可以考慮在 Python 中使用await或yield關鍵字這一方法來實現,但你之后會發現,這并不是唯一實現異步任務的方法。

一個異步應用程序完全運行在單個進程或線程中,這可以說是令人吃驚的。當然,這種類型的并發需要遵循一些規則,因此,你不能讓一個任務占用 CPU 太長時間,否則,剩余的任務會被阻塞。為了異步執行,所有的任務需要定時主動暫停并將控制權返還給循環。為了從異步方式獲益,一個應用程序需要有經常被 I/O 阻塞的任務,并且沒有太多 CPU 工作。Web 應用程序通常非常適合,特別是當它們需要處理大量客戶端請求時。

在使用一個異步服務器時,為了最大化多 CPU 的利用率,通常需要創建一個混合方案,增加一個負載均衡器并在每個 CPU 上運行一個異步服務器,如下圖所示:

2. Python 中實現異步的 2 種方法

我敢肯定,你知道要在 Python 中寫一個異步應用程序,你可以使用 asyncio package,這個包是在協程的基礎上實現了所有異步應用程序都需要的暫停和恢復特性。其中yield關鍵字,以及更新的async和await都是asyncio構建異步能力的基礎。

https://docs.python.org/3/library/asyncio.html

Python 生態系統中還有其它基于協程的異步方案,例如 Trio 和 Curio。還有 Twisted,它是所有協程框架中最古老的,甚至出現得比asyncio都要早。

如果你對編寫異步 Web 應用程序感興趣,有許多基于協程的異步框架可以選擇,包括 aiohttp、sanic、FastAPI 和 Tornado。

很多人不知道的是,協程只是 Python 中編寫異步代碼的兩種方法之一。第二種方法是基于一個叫做 greenlet 的庫,你可以用 pip 安裝它。Greenlets 和協程類似,它們也允許一個 Python 函數暫停執行并稍后恢復,但是它們實現這點的方式完全不同,這意味著 Python 中的異步生態系統分成兩大類。

協程與 greenlets 之間針對異步開發最有意思的區別是,前者需要 Python 語言特定的關鍵字和特性才能工作,而后者并不需要。我的意思是,基于協程的應用程序需要使用一種特定的語法來書寫,而基于 greenlet 的應用程序看起來幾乎和普通 Python 代碼一樣。這非常酷,因為在某些情況下,這讓同步代碼可以被異步執行,這是諸如asyncio之類的基于協程的方案做不到的。

那么在 greenlet 方面,跟asyncio對等的庫有哪些?我知道 3 個基于 greenlet 的異步包:Gevent、Eventlet 和 Meinheld,盡管最后一個更像是一個 Web 服務器而不是一個通用的異步庫。它們都有自己的異步循環實現,而且它們都提供了一個有趣的“monkey-patching”功能,取代了 Python 標準庫中的阻塞函數,例如那些執行網絡和線程的函數,并基于 greenlets 實現了等效的非阻塞版本。如果你有一些同步代碼想要異步運行,這些包會對你有所幫助。

據我所知,唯一明確支持 greenlet 的 Web 框架只有 Flask。這個框架會自動監測,當你想要運行在一個 greenlet Web 服務器上時,它會自我進行相應調整,而無需進行任何配置。這么做時,你需要注意不要調用阻塞函數,或者,如果你要調用阻塞函數,最好用猴子補丁來“修復”那些阻塞函數。

但是,Flask 并不是唯一受益于 greenlets 的框架。其它 Web 框架,例如 Django 和 Bottle],雖然沒有 greenlets,但也可以通過結合一個 greenlet Web 服務器并使用 monkey-patching 修復阻塞函數的方式來異步運行。

3. 異步比同步更快嗎?

對于同步和異步應用程序的性能,存在著一個廣泛的誤解——異步應用程序比同步應用程序快得多。

對此,我需要澄清一下。無論是用同步方式寫,還是用異步方式寫,Python 代碼運行速度是幾乎相同的。除了代碼,有兩個因素能夠影響一個并發應用程序的性能:上下文切換和可擴展性。

 上下文切換

在所有運行的任務間公平地共享 CPU 所需的工作,稱為上下文切換,能夠影響應用程序的性能。對同步應用程序來說,這項工作是由操作系統完成的,而且基本上是一個黑箱,不需要配置或微調選項。對異步應用程序來說,上下文切換是由循環完成的。

默認的循環實現由asyncio提供,是用 Python 編寫的,效率不是很高。而 uvloop 包提供了一個備選的循環方案,其中部分代碼是用 C 編寫的來實現更好的性能。Gevent 和 Meinheld 所使用的事件循環也是用 C 編寫的。Eventlet 用的是 Python 編寫的循環。

高度優化的異步循環比操作系統在進行上下文切換方面更有效率,但根據我的經驗,要想看到實際的效率提升,你運行的并發量必須非常大。對于大部分應用程序,我不認為同步和異步上下文切換之間的性能差距有多明顯。

 擴展性

我認為異步更快這個神話的來源是,異步應用程序通常會更有效地使用 CPU、能更好地進行擴展并且擴展方式比同步更靈活。

如果上面示意圖中的同步服務器同時收到 100 個請求,想一下會發生什么。這個服務器同時最多只能處理 4 個請求,因此大部分請求會停留在一個隊列中等待,直到它們被分配一個 worker。

與之形成對比的是,異步服務器會立即創建 100 個任務(或者使用混合模式的話,在 4 個異步 worker 上每個創建 25 個任務)。使用異步服務器,所有請求都會立即開始處理而不用等待(盡管公平地說,這種方案也還會有其它瓶頸會減慢速度,例如對活躍的數據庫連接的限制)。

如果這 100 個任務主要使用 CPU,那么同步和異步方案會有相似的性能,因為每個 CPU 運行的速度是固定的,Python 執行代碼的速度總是相同的,應用程序要完成的工作也是相同的。但是,如果這些任務需要做很多 I/O 操作,那么同步服務器只能處理 4 個并發請求而不能實現 CPU 的高利用率。而另一方面,異步服務器會更好地保持 CPU 繁忙,因為它是并行地運行所有這 100 個請求。

你可能會想,為什么你不能運行 100 個同步 worker,那樣,這兩個服務器就會有相同的并發能力。要注意,每個 worker 需要自己的 Python 解釋器以及與之相關聯的所有資源,再加上一份單獨的應用程序拷貝及其資源。你的服務器和應用程序的大小將決定你可以運行多少個 worker 實例,但通常這個數字不會很大。另一方面,異步任務非常輕量,都運行在單個 worker 進程的上下文中,因此具有明顯優勢。

綜上所述,只有如下場景時,我們可以說異步可能比同步快:

  •  存在高負載(沒有高負載,訪問的高并發性就沒有優勢)
  •  任務是 I/O 綁定的(如果任務是 CPU 綁定的,那么超過 CPU 數目的并發并沒有幫助)
  •  你查看單位時間內的平均請求處理數。如果你查看單個請求的處理時間,你不會看到有很大差別,甚至異步可能更慢,因為異步有更多并發的任務在爭奪 CPU。

4. 結論

希望本文能解答異步代碼的一些困惑和誤解。我希望你能記住以下兩個關鍵點:

  •  異步應用程序只有在高負載下才會比同步應用程序做得更好
  •  多虧了 greenlets,即使你用一般方式寫代碼并使用 Flask 或 Django 之類的傳統框架,也能從異步中受益。 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2021-04-02 11:05:57

Python同步異步

2022-10-27 08:31:31

架構

2021-11-11 06:57:00

PythonPyPy程序

2022-06-08 09:20:58

Python基準測試編程語言

2017-06-20 09:07:22

uvloopPython網絡框架

2018-01-30 18:15:12

Python網絡爬蟲gevent

2020-09-25 18:10:06

Python 開發編程語言

2019-07-15 09:09:29

RedisJava操作系統

2019-07-23 11:01:57

Python同步異步

2021-12-15 06:58:28

RedisEhCache緩存

2009-06-23 09:07:38

2023-09-08 15:05:51

Mojo編程語言

2019-07-26 10:15:06

Redis數據庫

2025-03-18 12:30:00

RubyJava語言

2023-05-15 07:20:24

2022-03-27 23:50:46

云計算邊緣計算技術

2022-03-26 21:34:54

邊緣計算云計算物聯網

2012-09-20 09:07:45

英特爾Xeon E5Xeon 5600

2020-02-04 08:00:12

囧媽哪里

2011-11-08 10:15:47

Scala
點贊
收藏

51CTO技術棧公眾號

欧美日韩综合视频网址| 久久av在线| 日韩区在线观看| 欧美亚洲综合在线| 免费看污久久久| 波多野结衣激情视频| 国产精品久久久久9999赢消| 日韩一级免费一区| 日韩欧美视频网站| 91涩漫在线观看| 国产精品66部| 日韩**中文字幕毛片| 蜜桃av.com| 精品按摩偷拍| 欧美视频一二三区| 久艹在线免费观看| 成人一区二区不卡免费| 国产91精品在线观看| 国产成+人+综合+亚洲欧洲| tube国产麻豆| 久久91麻豆精品一区| 91精品国产91久久综合桃花| 啊啊啊一区二区| 黄页视频在线播放| 26uuu另类欧美| 亚洲最大的网站| 精品成人无码久久久久久| 欧美99久久| 国产午夜精品全部视频播放| 中文字幕制服丝袜| 青娱乐极品盛宴一区二区| 欧美日韩亚洲一区二| 男同互操gay射视频在线看| 日本亚洲欧美| 成人深夜在线观看| 91天堂在线视频| 欧美日韩 一区二区三区| 伊人久久婷婷| 欧美区在线播放| 91禁男男在线观看| 狠狠色丁香婷婷综合影院| 精品第一国产综合精品aⅴ| 8x8x成人免费视频| 国产69精品久久久久9999人| 欧美日韩在线免费| 久久久久久www| 欧美人与禽猛交乱配| 欧美xxxx免费虐| 午夜在线精品偷拍| 久久久在线观看| 毛片aaaaa| 国产精品久久久久久久免费观看 | 精品综合免费视频观看| 日韩av日韩在线观看| 亚洲精品午夜久久久久久久| 韩国av一区| 欧美成在线观看| 中文字幕另类日韩欧美亚洲嫩草| 99久久激情| 日韩一区二区精品视频| 91视频免费在观看| 精品国产一区一区二区三亚瑟 | av在线电影免费观看| 91蜜桃传媒精品久久久一区二区| 成人av网站观看| 精品久久久无码中文字幕| 国产精品综合网| 999国内精品视频在线| 国内精品偷拍视频| 高清不卡一区二区在线| av色综合网| 免费成人在线看| 91丨九色丨尤物| 欧美激情第六页| 免费在线毛片| 亚洲国产成人私人影院tom| 亚洲精品永久www嫩草| 久久精品一区二区三区四区五区| 四虎国产精品永远| 99免费精品在线观看| 久久国产精品 国产精品| 亚洲三级黄色片| 久久久久久久电影| 亚洲一卡二卡区| 69xxx在线| 午夜精品成人在线| 男人操女人免费| 成人免费黄色| 日韩三级免费观看| 国产精品无码专区| 成人在线免费小视频| 久久香蕉国产线看观看av| 欧美黄色免费在线观看| 国产精品久久久久久久久久妞妞| 国产高清在线不卡| 国产乱码久久久| 成人v精品蜜桃久久一区| 免费日韩av电影| 日本视频在线免费观看| 亚洲综合精品自拍| 一本久道综合色婷婷五月| 日韩毛片免费看| 国产第一精品| 欧美日韩高清一区二区三区| 欧美一级大片免费看| 日韩精品a在线观看91| 这里只有精品在线播放| 青青草偷拍视频| 日韩vs国产vs欧美| 国产精品国产一区二区| av在线三区| 亚洲国产精品久久艾草纯爱| 国产高清视频网站| 免费成人蒂法| 日韩在线播放一区| 日韩精品在线观看免费| 精品影视av免费| 麻豆一区区三区四区产品精品蜜桃| 成年人视频网站在线| 亚洲第一精品在线| 色婷婷一区二区三区av免费看| 大桥未久女教师av一区二区| 色妞色视频一区二区三区四区| 国产小视频在线看| 另类欧美日韩国产在线| 久久精品国产一区二区三区不卡| 国产三区在线观看| 欧美三级韩国三级日本三斤| 日批在线观看视频| 影音先锋成人在线电影| 国产精品美女呻吟| 青青操在线视频| 性欧美大战久久久久久久久| 在线播放日韩av| 搡女人真爽免费午夜网站| 国产精品午夜av| 免费av一区二区| 在线观看中文字幕码| 91蜜桃传媒精品久久久一区二区| 欧美黑人在线观看| 国产亚洲久久| 中文字幕亚洲欧美日韩高清| 欧美特黄aaaaaa| av一区二区三区四区| 激情五月婷婷六月| 亚洲精品在线播放| 久久综合免费视频影院| 国产精品无码在线播放| 欧美激情一区在线观看| 精品久久久久久中文字幕2017| 天天操综合520| 91高潮精品免费porn| 欧美特级特黄aaaaaa在线看| 亚洲一区二区在线播放相泽| 国模大尺度视频| 中出一区二区| 999在线免费观看视频| 在线观看av免费| 日韩一二三区不卡| 欧美精品成人久久| 国产精品123区| 国产盗摄视频在线观看| 成人免费91| 美日韩丰满少妇在线观看| 国产欧美综合视频| 亚洲夂夂婷婷色拍ww47| 国产伦精品一区二区三区精品 | 福利在线一区二区| 国产成人福利av| 91sa在线看| 国产福利小视频在线观看| 欧洲亚洲精品在线| 麻豆明星ai换脸视频| 粉嫩久久99精品久久久久久夜| 国产一区二区视频播放| 国产一区二区三区四区大秀| 国产精品视频1区| 国产cdts系列另类在线观看| 日韩免费高清av| 97久久久久久久| 中文字幕精品在线不卡| 成人在线短视频| 亚洲国产专区| 欧美成人午夜剧场免费观看| 国产无色aaa| 欧美日韩1区| 精品免费二区三区三区高中清不卡| 欧美日韩国产观看视频| 在线看日韩欧美| 国产a级免费视频| 欧美色播在线播放| 久久国产高清视频| 99视频一区二区| 9l视频白拍9色9l视频| 欧美另类亚洲| 日韩精品一区二区三区色偷偷 | 亚洲精品乱码久久| 久久最新视频| 亚洲精品偷拍视频| 奇米影视777在线欧美电影观看 | 欧美午夜精品理论片a级大开眼界| 人妖欧美1区| 亚洲色图美腿丝袜| 国产人妻精品一区二区三区| 亚洲成av人片一区二区梦乃| av男人的天堂av| 成人免费视频app| 可以在线看的黄色网址| 国产精品成人a在线观看| 国产福利久久| 丁香婷婷久久| 国模精品视频一区二区| 成年人视频在线免费观看| 欧美一区二区三区男人的天堂| 在线观看亚洲天堂| 最好看的中文字幕久久| 国产精品探花一区二区在线观看| 麻豆精品精品国产自在97香蕉| 缅甸午夜性猛交xxxx| av资源久久| 国产精品久久久久久久久婷婷| heyzo在线播放| 欧美另类高清videos| 黄色片视频在线观看| 欧美成人激情免费网| 69成人免费视频| 亚洲综合丝袜美腿| 国产欧美小视频| 99久久婷婷国产综合精品| 91视频免费版污| 国产精品试看| 男人c女人视频| 日产精品一区二区| 亚洲三级 欧美三级| 亚洲最大视频网| 奇米色777欧美一区二区| 免费网站在线观看视频| 中文字幕午夜精品一区二区三区| 蜜桃网站成人| www.豆豆成人网.com| 茄子视频成人在线| 国内精彩免费自拍视频在线观看网址| 日韩小视频在线| 精品影院一区| 亚洲成人av资源网| 精品久久人妻av中文字幕| 欧美亚洲国产一区二区三区va| 精品91久久久| 欧美日韩国产中字| 日韩欧美亚洲国产| 一区二区成人在线观看| 国产精品麻豆免费版现看视频| 欧美激情在线一区二区| 91久久免费视频| 久久亚洲免费视频| 漂亮人妻被黑人久久精品| 白白色 亚洲乱淫| 少妇熟女视频一区二区三区 | 精品亚洲一区二区三区在线观看| 性欧美一区二区三区| 91精品在线免费观看| 91在线观看喷潮| 欧美一级日韩一级| 99热这里只有精品66| 8v天堂国产在线一区二区| 91丨porny丨在线中文 | 日韩一区二区三区国产| sese在线视频| 中文字幕亚洲欧美| 日本亚洲精品| 欧美精品videossex性护士| 国产美女情趣调教h一区二区| 久久91精品国产| 成人看av片| 性金发美女69hd大尺寸| 欧美亚洲日本精品| 奇米4444一区二区三区| 成人精品国产亚洲| 91精品在线看| 91亚洲无吗| 久久久久久a亚洲欧洲aⅴ| 91人人澡人人爽| 视频一区中文字幕| 手机看片福利日韩| 日本亚洲视频在线| 男插女视频网站| 成人精品高清在线| 国产一级二级在线观看| 中文子幕无线码一区tr | 成人免费黄色在线| 国产精品成人99一区无码| 国产午夜精品久久久久久免费视| 人妻熟人中文字幕一区二区| 亚洲欧洲国产日韩| 日韩精品久久久久久久酒店| 色综合网色综合| 亚洲在线观看av| 日韩女优电影在线观看| 国产精品久久久久一区二区国产| 色婷婷av一区二区三区久久| 国产三级在线播放| 日本国产一区二区三区| 精品国产黄a∨片高清在线| 91久久大香伊蕉在人线| 卡通动漫精品一区二区三区| 中文字幕一区二区三区乱码 | 中文欧美日本在线资源| 1区2区在线观看| 91成品人片a无限观看| 国产精品日韩精品在线播放| 国产一区自拍视频| 成人在线电影在线观看视频| 缅甸午夜性猛交xxxx| 久久激五月天综合精品| 一级少妇精品久久久久久久| 99国产精品久| 免费看一级一片| 欧美主播一区二区三区| 亚洲欧美黄色片| 久久综合网hezyo| 三上悠亚激情av一区二区三区| 91精品视频在线看| 精品国产一区二| 日韩欧美在线观看强乱免费| 欧美日韩精品免费观看视频完整| 日本在线观看a| av亚洲产国偷v产偷v自拍| 欧美爱爱免费视频| 在线看一区二区| 青梅竹马是消防员在线| 欧美激情视频三区| 99视频有精品高清视频| 视频一区二区三区免费观看| 亚洲精品在线二区| 激情久久综合网| 久久精品水蜜桃av综合天堂| 日韩av无码中文字幕| 666欧美在线视频| 国产小视频在线播放| 日本在线精品视频| 美女主播精品视频一二三四| 日本老太婆做爰视频| 天天操天天干天天| 91麻豆精品91久久久久久清纯 | 亚洲综合电影| 成人羞羞视频免费| 66视频精品| 超碰在线人人爱| www国产精品av| 日本少妇吞精囗交| 欧美高清视频在线高清观看mv色露露十八| 国产综合在线播放| 久久福利视频导航| 亚洲日本免费电影| 成年人黄色在线观看| 美国一区二区三区在线播放| 亚洲做受高潮无遮挡| 亚洲高清免费一级二级三级| 精品黑人一区二区三区国语馆| 久久久www成人免费精品张筱雨| 成人在线啊v| av动漫免费观看| 精品在线观看视频| 欧美日韩大片在线观看| 欧美一区二区三区色| 超碰个人在线| 国产美女精品在线观看| 在线不卡视频| 88av在线播放| 欧美性xxxxxx| 久久国产精品高清一区二区三区| 日本成人激情视频| 久久高清免费| 99中文字幕在线| 一区二区三区四区av| 偷拍精品一区二区三区| 2021久久精品国产99国产精品| 欧美一区 二区| 日本老熟妇毛茸茸| 亚洲国产精品黑人久久久| 91国产免费视频| 九九久久综合网站| 精品亚洲自拍| 免费一级特黄毛片| 国产日韩综合av| 国产又黄又大又爽| 不卡av电影院| 大奶一区二区三区| av动漫免费看| 97人妻精品一区二区三区免| 日韩欧美在线字幕| 尤物网在线观看| 成人自拍视频网站| 新67194成人永久网站| 91社区视频在线观看| 精品久久久久久久久久久院品网| 日韩理论视频| 先锋影音网一区| 懂色一区二区三区免费观看| 中国一级免费毛片|