在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析同步與異步Python的區別與概述

Q4MP_gh_c472c21 ? 來源:InfoQ技術實驗室 ? 作者:Miguel Grinberg ? 2021-04-25 13:53 ? 次閱讀

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

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

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

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

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

a30e68b6-a57e-11eb-aece-12bb97331649.png

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

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

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

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

a336e69c-a57e-11eb-aece-12bb97331649.png

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

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

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

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

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

a359ad6c-a57e-11eb-aece-12bb97331649.png

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

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

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代碼運行速度是幾乎相同的。除了代碼,有兩個因素能夠影響一個并發應用程序的性能:上下文切換和可擴展性。

(1)上下文切換

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

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

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

(2)擴展性

我認為異步更快這個神話的來源是,異步應用程序通常會更有效地使用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之類的傳統框架,也能從異步中受益。
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1269

    瀏覽量

    69733
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69059
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85040

原文標題:同步與異步Python有何不同?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    同步電機與異步電機在功能、用途上的主要區別是什么?

    同步電機和異步電機是兩種常見的交流電機類型,它們在功能和用途上有一些顯著的區別。 工作原理: 同步電機和異步電機的主要
    的頭像 發表于 10-24 13:51 ?649次閱讀

    pwm同步調制和異步調制的區別

    PWM(Pulse Width Modulation,脈沖寬度調制)是一種常見的調制方式,廣泛應用于通信、控制等領域。PWM調制分為同步調制和異步調制兩種方式,它們在性能、應用場景等方面存在一定
    的頭像 發表于 08-14 11:15 ?2655次閱讀

    同步降壓和異步降壓有什么區別

    同步降壓和異步降壓是兩種在電源轉換中常用的技術,它們在實現方式、控制方法、效率、成本及應用領域等方面存在顯著差異。以下是對這兩種技術的詳細比較和分析。
    的頭像 發表于 08-14 10:08 ?2478次閱讀

    同步通信和異步通信的區別

    在數據通信領域,同步通信和異步通信是兩種基本的通信方式,它們各自具有獨特的特點和適用場景。了解這兩種通信方式的基本概念、區別以及應用場景,對于設計高效、可靠的通信系統具有重要意義。
    的頭像 發表于 07-25 16:28 ?8177次閱讀

    怎么判斷同步清零和異步清零

    異步清零都是對寄存器或計數器進行清零操作的方式,它們的主要區別在于清零信號的觸發方式。 同步清零:同步清零是指在時鐘信號的控制下,將寄存器或計數器的值清零。在
    的頭像 發表于 07-23 11:11 ?4083次閱讀

    異步置零和同步置零的區別在哪里

    異步置零和同步置零是數字電路設計中兩種不同的置零方法。它們在實現方式、性能和應用場景上有所不同。 實現方式: 異步置零:異步置零是指在數字電路中,置零信號與時鐘信號無關,可以在任何時刻
    的頭像 發表于 07-23 11:09 ?2693次閱讀

    異步感應電機和永磁同步電機區別

    異步感應電機和永磁同步電機是兩種常見的電動機類型,它們在結構、工作原理、性能特點、應用領域等方面存在一些區別。以下是對這兩種電動機的比較分析: 結構區別
    的頭像 發表于 06-13 09:45 ?1536次閱讀

    同步電機與異步電機變頻器的區別

    上存在差異,這也導致了在變頻控制方面,同步電機和異步電機變頻器存在顯著的區別。本文將對這兩種變頻器的區別進行詳細的闡述,以期為相關領域的專業人士提供參考。
    的頭像 發表于 06-11 17:59 ?1994次閱讀

    同步電機與異步電機的區別

    在電機技術領域中,同步電機和異步電機是兩種常見的電機類型。它們各自具有獨特的特性和應用場景,為工業生產和日常生活提供了不可或缺的動力支持。本文旨在深入探討同步電機與異步電機的
    的頭像 發表于 06-03 15:47 ?1966次閱讀

    同步計數器和異步計數器的區別

    在數字電子領域中,計數器是一種用于統計脈沖信號數量的重要設備。其中,同步計數器和異步計數器是兩種不同類型的計數器,它們在工作原理、特性以及應用場景等方面存在著顯著的區別。本文將詳細探討這兩種計數器的
    的頭像 發表于 05-24 14:36 ?4734次閱讀

    LED顯示屏同步系統與異步系統的區別

    在LED顯示屏中,控制系統也是很重要的一個部分。LED顯示屏的控制系統,一般情況下分為同步系統和異步系統這兩種。
    發表于 04-03 11:38 ?1046次閱讀

    同步整流型和異步整流型的區別在哪

    同步整流型和異步整流型開關穩壓器是電源轉換技術中的兩種常見類型,它們在實現降壓(Buck)或其他類型的電壓轉換功能時具有不同的電路配置和工作原理。主要區別在于整流元件的選擇和控制方式,這些差異影響了
    的頭像 發表于 02-25 17:38 ?1245次閱讀
    <b class='flag-5'>同步</b>整流型和<b class='flag-5'>異步</b>整流型的<b class='flag-5'>區別</b>在哪

    verilog同步異步區別 verilog阻塞賦值和非阻塞賦值的區別

    Verilog中同步異步區別,以及阻塞賦值和非阻塞賦值的區別。 一、Verilog中同步異步
    的頭像 發表于 02-22 15:33 ?1835次閱讀

    計數器怎么判斷同步異步 計數器異步同步區別

    計數器是計算機領域中常用的一種數據結構,用于記錄和控制程序執行中的指令或事件發生的次數。計數器可以根據同步機制或異步機制進行操作。本文將詳細討論計數器的同步性和異步性,深入探討兩者的
    的頭像 發表于 02-22 15:14 ?4083次閱讀

    同步級聯和異步級聯的區別 異步級聯和同步級聯分別要注意什么

    異步級聯可以提高系統的響應速度和并行處理的能力。 與同步級聯相比,異步級聯具有以下幾點區別: 并行處理能力:異步級聯允許模塊在同一時刻并行
    的頭像 發表于 02-22 13:40 ?2069次閱讀
    主站蜘蛛池模板: 久久涩精品| 亚洲福利视频网站 | 久久久xxx | 天堂在线中文无弹窗全文阅读 | 欧美成人一区二区三区在线电影 | 99r8这里精品热视频免费看 | 国产色妞妞在线视频免费播放 | 午夜影院免费入口 | 亚洲视频第一页 | videossexotv极度另类高清 | 人人干日日操 | 国语一区 | 性视频网址| aa视频免费 | 男女性gif抽搐出入 男女性高爱潮免费的国产 男女性高爱麻豆 | 视频一本大道香蕉久在线播放 | 午夜一区二区在线观看 | www.婷婷.com| 国产亚洲午夜精品a一区二区 | 色wwww| 美女扒开腿让男人桶尿口 | 五月天免费在线播放 | 亚洲一区二区三区免费在线观看 | 丁香五月缴情综合网 | 三级网站免费看 | 每日最新avhd101天天看新片 | 久久做| 五月天丁香婷婷开心激情五月 | 丁香五婷婷 | 日韩精品免费一级视频 | 日韩精品在线一区二区 | 四虎海外在线永久免费看 | 日本黄色高清视频网站 | 性性欧美| 欧美专区一区二区三区 | 日韩一级片免费看 | 欧美色香蕉| 国产一级αv片免费观看 | eeuss影院www影院夜场 | 国产婷婷高清在线观看免费 | 亚洲人一区 |