chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

淺析同步與異步Python的區(qū)別與概述

Q4MP_gh_c472c21 ? 來源:InfoQ技術實驗室 ? 作者:Miguel Grinberg ? 2021-04-25 13:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

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

這種類型的服務器運行在單個進程中,通過循環(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)它需要等待什么,然后將控制權返回給它。循環(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)異步任務的方法。

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

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

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

2、Python中實現(xiàn)異步的2種方法

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

Python生態(tài)系統(tǒng)中還有其它基于協(xié)程的異步方案,例如Trio和Curio。還有Twisted,它是所有協(xié)程框架中最古老的,甚至出現(xiàn)得比asyncio都要早。如果你對編寫異步Web應用程序感興趣,有許多基于協(xié)程的異步框架可以選擇,包括aiohttp、sanic、FastAPI和Tornado。

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

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

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

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

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

3、異步比同步更快嗎?

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

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

(1)上下文切換

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

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

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

(2)擴展性

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

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

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

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

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

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

存在高負載(沒有高負載,訪問的高并發(fā)性就沒有優(yōu)勢);

任務是I/O綁定的(如果任務是CPU綁定的,那么超過CPU數(shù)目的并發(fā)并沒有幫助);

你查看單位時間內(nèi)的平均請求處理數(shù)。如果你查看單個請求的處理時間,你不會看到有很大差別,甚至異步可能更慢,因為異步有更多并發(fā)的任務在爭奪CPU。

4、結論

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

異步應用程序只有在高負載下才會比同步應用程序做得更好;

多虧了greenlets,即使你用一般方式寫代碼并使用Flask或Django之類的傳統(tǒng)框架,也能從異步中受益。
編輯:lyn

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

    關注

    2

    文章

    1301

    瀏覽量

    73596
  • 代碼
    +關注

    關注

    30

    文章

    4940

    瀏覽量

    73074
  • python
    +關注

    關注

    57

    文章

    4856

    瀏覽量

    89522

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    高速數(shù)據(jù)存取同步SRAM與異步SRAM的區(qū)別

    存儲解決方案。與傳統(tǒng)的異步SRAM相比,同步SRAM在結構和工作機制上進行了優(yōu)化,能夠更好地適應高速數(shù)據(jù)處理場景,因此在通信設備、嵌入式系統(tǒng)及高性能計算等領域被廣泛應用。
    的頭像 發(fā)表于 11-18 11:13 ?116次閱讀

    為什么同步電機多做發(fā)電機而異步電機多做電動機?

    根本原因在于:? ?同步電機能精確控制磁場(勵磁),而異步電機不能。? ?下面我們從研發(fā)的四個核心維度進行深度解讀。 一、核心原理與特性對比(研發(fā)的出發(fā)點) 特性維度 同步電機 異步
    的頭像 發(fā)表于 10-30 16:21 ?862次閱讀

    Python 給 Amazon 做“全身 CT”——可量產(chǎn)、可擴展的商品詳情爬蟲實戰(zhàn)

    一、技術選型:為什么選 Python 而不是 Java? 結論: “調(diào)研階段用 Python,上線后如果 QPS 爆表再考慮 Java 重構。” 二、整體架構速覽(3 分鐘看懂) 三、開發(fā)前準備(5
    的頭像 發(fā)表于 10-21 16:59 ?371次閱讀
    用 <b class='flag-5'>Python</b> 給 Amazon 做“全身 CT”——可量產(chǎn)、可擴展的商品詳情爬蟲實戰(zhàn)

    termux如何搭建python游戲

    用VS Code編輯 - 版本控制:`git`管理代碼,同步至GitHub/Gitee - 任務調(diào)度:通過`crontab`設置定時測試(如每分鐘運行游戲腳本:`*/1 * * * * python
    發(fā)表于 08-29 07:06

    從底層解讀labview的TDMS高級異步寫入的工作原理

    請求提交的順序)。 關鍵點總結: 異步: 指調(diào)用寫入函數(shù)后立即返回,不阻塞調(diào)用線程,實際寫入由后臺處理。 高級: 通常指提供更精細控制的函數(shù)(如設置緩沖區(qū)大小、刷新策略),區(qū)別于基本的異步寫入
    發(fā)表于 08-14 17:05

    CS57066支持22A 4.5V~24V輸入,單節(jié)鋰電池適用低靜態(tài)電流,兼容同步異步外圍應用,DC-DC升壓IC

    CS57066支持22A 4.5V~24V輸入,單節(jié)鋰電池適用低靜態(tài)電流,兼容同步異步外圍應用,DC-DC升壓IC
    的頭像 發(fā)表于 07-14 20:50 ?336次閱讀
    CS57066支持22A 4.5V~24V輸入,單節(jié)鋰電池適用低靜態(tài)電流,兼容<b class='flag-5'>同步</b>和<b class='flag-5'>異步</b>外圍應用,DC-DC升壓IC

    同步快?異步穩(wěn)?串口通信方案選擇的避坑指南

    我們常用的串口究竟是同步還是異步?藍牙模塊、WiFi模塊用的又是什么方式?今天,我們就來一探究竟,講清楚串口通信的同步異步區(qū)別。 1.
    的頭像 發(fā)表于 07-09 16:58 ?529次閱讀
    <b class='flag-5'>同步</b>快?<b class='flag-5'>異步</b>穩(wěn)?串口通信方案選擇的避坑指南

    AMD FPGA異步模式與同步模式的對比

    本文講述了AMD UltraScale /UltraScale+ FPGA 原生模式下,異步模式與同步模式的對比及其對時鐘設置的影響。
    的頭像 發(fā)表于 07-07 13:47 ?1407次閱讀

    同步電機失步淺析

    純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:同步電機失步淺析.pdf【免責聲明】本文系網(wǎng)絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內(nèi)容!
    發(fā)表于 06-20 17:42

    第二十四章 通用同步異步收發(fā)器(USART)

    本文介紹了W55MH32的通用同步異步收發(fā)器(USART),其支持全雙工異步通信、NRZ格式,具分數(shù)波特率發(fā)生器,可編程數(shù)據(jù)字長、停止位等。支持LIN、IrDA等模式,有DMA及多種中斷,適用于多場景高速通信。
    的頭像 發(fā)表于 05-29 15:44 ?2044次閱讀
    第二十四章 通用<b class='flag-5'>同步</b><b class='flag-5'>異步</b>收發(fā)器(USART)

    基礎篇-開關電源的同步與非同步

    同步開關電源和異步開關電源之前,我們首先來回顧一下傳統(tǒng)的開關電源,工作工程見下: 當Q1打開,Q2關閉,Vsw為高,IQ1增加,IQ2為零,電感電流增加。 當Q1關閉,Q2打開,Vsw為低,IQ1為零
    發(fā)表于 04-17 11:49

    德國SycoTec高速主軸科普:電機的主要類型概述

    從軋機到電熱水壺,從電動汽車到牙科技術:如今,電機作為驅動裝置幾乎應用于所有類型的機器中。但電機并非千篇一律,主要分為直流電機和交流電機,其中又包含異步電機和同步電機。本文將帶您了解不同類型電機的區(qū)別、核心特性及各自優(yōu)勢。
    的頭像 發(fā)表于 04-15 09:30 ?730次閱讀
    德國SycoTec高速主軸科普:電機的主要類型<b class='flag-5'>概述</b>

    使用Python API在OpenVINO?中創(chuàng)建了用于異步推理的自定義代碼,輸出張量的打印結果會重復,為什么?

    使用 Python* API 在 OpenVINO? 中創(chuàng)建了用于異步推理的自定義代碼。 遇到輸出張量的打印結果會重復的問題,即使輸入圖像不同。
    發(fā)表于 03-06 07:53

    Python繪圖Matplotlib快速參考手冊

    ?PYTHON
    發(fā)表于 02-07 14:04 ?0次下載

    使用Python實現(xiàn)xgboost教程

    使用Python實現(xiàn)XGBoost模型通常涉及以下幾個步驟:數(shù)據(jù)準備、模型訓練、模型評估和模型預測。以下是一個詳細的教程,指導你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發(fā)表于 01-19 11:21 ?2188次閱讀