異步編程入門

本文部分翻譯自krondoIn Which We Begin at the Beginning

Twisted

編程模型

在介紹異步模型前狠裹,我們先介紹一下兩種常見的模型榕订。

同步模型

現(xiàn)在有一個(gè)程序要完成三個(gè)毫不相關(guān)的任務(wù)俊鱼。第一種解決方式是采用單線程同步模型蛹磺,如下圖。

圖1

這是最簡(jiǎn)單的一種方式瞧哟,每次只執(zhí)行一個(gè)任務(wù)。如果所有任務(wù)總是以確定的順序執(zhí)行枪向,則后面的任務(wù)可以假設(shè)前面的任務(wù)已經(jīng)完成并且沒(méi)有錯(cuò)誤--這個(gè)執(zhí)行邏輯非常簡(jiǎn)單勤揩。

我們可以把這種同步模型和下面的多線程模型比較一下。

多線程模型

圖2

在多線程的模型中秘蛔,每個(gè)任務(wù)在單獨(dú)的控制線程中執(zhí)行陨亡。線程由操作系統(tǒng)管理,并且可以在具有多處理器/多核的系統(tǒng)上真正并發(fā)地運(yùn)行深员,或者可以在單個(gè)處理器上交織著運(yùn)行负蠕。這個(gè)模型的關(guān)鍵在于,多線程模型中的執(zhí)行細(xì)節(jié)由操作系統(tǒng)處理倦畅,程序員只需要將任務(wù)看成可以同時(shí)運(yùn)行的指令流就可以了遮糖。雖然模型圖簡(jiǎn)單,但是在實(shí)踐中叠赐,涉及到多線程的程序可能相當(dāng)復(fù)雜欲账,因?yàn)樾枰€程之間彼此協(xié)調(diào)。線程通信和協(xié)調(diào)是一個(gè)高級(jí)編程主題芭概,實(shí)踐起來(lái)很有難度赛不。

有一些程序使用多進(jìn)程而不是多線程來(lái)實(shí)現(xiàn)并行,雖然實(shí)現(xiàn)的細(xì)節(jié)不同罢洲,但是編程模型是一樣的踢故。

異步模型

現(xiàn)在我們來(lái)介紹異步編程模型。

圖3

在這個(gè)模型里惹苗,任務(wù)在單個(gè)控制線程中彼此交錯(cuò)執(zhí)行殿较。這個(gè)模型比多線程模型要簡(jiǎn)單,因?yàn)槌绦騿T總是知道在一個(gè)時(shí)間點(diǎn)只有一個(gè)任務(wù)在執(zhí)行鸽粉。雖然在單處理器系統(tǒng)中斜脂,多線程模型的程序也會(huì)以交錯(cuò)的方式執(zhí)行,但是采用多線程的程序員仍然應(yīng)該考慮圖2二不是圖3触机,以免程序在多處理器的系統(tǒng)上不能正確工作帚戳。即使在多處理器系統(tǒng)上玷或,多線程異步程序也始終交織執(zhí)行。

異步模型和多線程模型還有另外一個(gè)區(qū)別片任。在多線程模型中偏友,暫停一個(gè)線程并執(zhí)行另一個(gè)線程的決定大部分在程序員的控制之外。相反对供,這些決定是在操作系統(tǒng)的控制下位他,程序員必須假設(shè)線程可以被掛起并在幾乎任何時(shí)間被另一個(gè)線程替換。相比之下产场,異步模型的程序會(huì)繼續(xù)運(yùn)行鹅髓,直到它顯式地放棄對(duì)其他任務(wù)的控制。這是對(duì)多線程模型的進(jìn)一步簡(jiǎn)化京景。

注意窿冯,可以將異步和多線程模型混合,在同一系統(tǒng)中使用确徙。在對(duì)于這篇介紹中醒串,我們將堅(jiān)持使用具有一個(gè)控制線程的異步系統(tǒng)的“普通原型”。

動(dòng)機(jī)

我們已經(jīng)知道異步模型比多線程模型要簡(jiǎn)單鄙皇,因?yàn)樵谝粋€(gè)指令流中任務(wù)可以顯式放棄控制芜赌,而不是被任意懸掛。但是異步模型顯然比同步模型更復(fù)雜伴逸。程序員必須將每個(gè)任務(wù)組織為間歇執(zhí)行的一系列較小步驟缠沈。如果一個(gè)任務(wù)使用到了另一個(gè)任務(wù)的輸出,則從屬任務(wù)必須將其輸入分成許多小部分违柏,而不是全部一起傳入博烂。由于沒(méi)有實(shí)際的并行性,從我們的圖標(biāo)中可以看出漱竖,異步程序?qū)⑿枰谕匠绦蛞粯娱L(zhǎng)的執(zhí)行時(shí)間禽篱,或許會(huì)需要更長(zhǎng)的時(shí)間,因?yàn)楫惒匠绦蚩赡鼙憩F(xiàn)出較差的參考局部性馍惹。

為什么要選擇使用異步模型呢躺率?至少有兩個(gè)原因。首先万矾,如果一個(gè)或多個(gè)任務(wù)用于實(shí)現(xiàn)與人交互的接口悼吱,通過(guò)將任務(wù)交織在一起,系統(tǒng)可以保持響應(yīng)用戶輸入良狈,同時(shí)仍然在“后臺(tái)”執(zhí)行其他工作后添。因此,雖然后臺(tái)任務(wù)可能不會(huì)執(zhí)行地更快薪丁,但是使用這個(gè)系統(tǒng)的人體驗(yàn)會(huì)更好遇西。

然而馅精,存在這樣一種情況,在該情況下粱檀,如果只考慮任務(wù)總體的執(zhí)行時(shí)間洲敢,異步模型將完全優(yōu)于同步模型。這樣的情況就是任務(wù)被強(qiáng)制等待或者阻塞茄蚯,如圖4所示:

圖4

途中的灰色部分表示特定任務(wù)正處于等待(阻塞)狀態(tài)压彭,因此程序會(huì)卡在這里。為什么任務(wù)會(huì)被阻塞呢渗常?常見的原因是它正在等待執(zhí)行I/O壮不,來(lái)向外部設(shè)備傳輸數(shù)據(jù)會(huì)著從外部設(shè)備傳入數(shù)據(jù)。一般CPU處理數(shù)據(jù)傳輸?shù)乃俣缺却疟P或者網(wǎng)卡要快幾個(gè)數(shù)量級(jí)皱碘。因此忆畅,執(zhí)行大量I/O的同步程序?qū)⒒ㄙM(fèi)大部分時(shí)間等待磁盤或者網(wǎng)絡(luò)。由于這個(gè)原因尸执,這種同步程序也被稱為阻塞程序。

注意到圖4中的阻塞程序看起來(lái)有點(diǎn)像圖3中的異步程序缓醋。這并不是偶然的如失。異步模型背后的基本思想是,異步程序在面對(duì)同步程序中通常會(huì)阻塞的任務(wù)時(shí)送粱,會(huì)切換到其他可以繼續(xù)執(zhí)行的任務(wù)褪贵。僅當(dāng)沒(méi)有任何任務(wù)可以執(zhí)行時(shí),異步任務(wù)會(huì)“阻塞”抗俄,因此異步任務(wù)也被稱為非阻塞程序脆丁。當(dāng)一個(gè)任務(wù)完成,或者到達(dá)阻塞的狀態(tài)時(shí)动雹,程序會(huì)切換到另一個(gè)任務(wù)槽卫。當(dāng)存在大量可能會(huì)阻塞的任務(wù)時(shí),異步任務(wù)相比同步任務(wù)胰蝠,總體等待I/O的時(shí)間會(huì)少很多歼培,而真正執(zhí)行任務(wù)的時(shí)間會(huì)大致相等。

相比于同步模型茸塞,滿足下面條件時(shí)躲庄,異步模型性能最好:

  1. 程序有大量任務(wù),所以總是有至少一個(gè)任務(wù)可以被執(zhí)行
  2. 任務(wù)會(huì)執(zhí)行大量I/O钾虐,導(dǎo)致同步程序浪費(fèi)大量時(shí)間在阻塞上噪窘,這些時(shí)間本可以用來(lái)執(zhí)行其他任務(wù)
  3. 任務(wù)之間彼此獨(dú)立,幾乎不需要任務(wù)間通信(一個(gè)任務(wù)等待另外一個(gè)任務(wù))效扫。

在客戶端-服務(wù)器架構(gòu)下繁忙的網(wǎng)絡(luò)服務(wù)器(如web服務(wù)器)幾乎完美地符合上面的條件倔监≈鄙埃客戶端每次發(fā)送請(qǐng)求和接收響應(yīng),都可以看作是一次I/O任務(wù)丐枉,并且客戶的請(qǐng)求之間是互相獨(dú)立的哆键。因此,異步模型主要用于網(wǎng)絡(luò)服務(wù)器的實(shí)現(xiàn)瘦锹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末籍嘹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弯院,更是在濱河造成了極大的恐慌辱士,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件听绳,死亡現(xiàn)場(chǎng)離奇詭異颂碘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)椅挣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門头岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鼠证,你說(shuō)我怎么就攤上這事峡竣。” “怎么了量九?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵适掰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荠列,道長(zhǎng)类浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任肌似,我火速辦了婚禮费就,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘川队。我一直安慰自己受楼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布呼寸。 她就那樣靜靜地躺著艳汽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对雪。 梳的紋絲不亂的頭發(fā)上河狐,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼馋艺。 笑死栅干,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捐祠。 我是一名探鬼主播碱鳞,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踱蛀!你這毒婦竟也來(lái)了窿给?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤率拒,失蹤者是張志新(化名)和其女友劉穎崩泡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猬膨,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡角撞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勃痴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒所。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沛申,靈堂內(nèi)的尸體忽然破棺而出百炬,到底是詐尸還是另有隱情,我是刑警寧澤污它,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站庶弃,受9級(jí)特大地震影響衫贬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歇攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一固惯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缴守,春花似錦葬毫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至村砂,卻和暖如春烂斋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工汛骂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罕模,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓帘瞭,卻偏偏與公主長(zhǎng)得像淑掌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝶念,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 這幾天看代碼抛腕,總是會(huì)接觸到很多異步編程,之前只想著實(shí)現(xiàn)功能祸轮,從來(lái)沒(méi)考慮過(guò)代碼的運(yùn)行快慢問(wèn)題兽埃,故學(xué)習(xí)一番。 參考鏈接...
    小小怪吃吃吃閱讀 4,940評(píng)論 0 2
  • 轉(zhuǎn)自: http://www.reibang.com/p/486b0965c296 http://www.jia...
    demop閱讀 3,880評(píng)論 1 21
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口适袜,提供良好的抽象接口柄错。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,530評(píng)論 0 5
  • 上篇 中篇 下篇 1 什么是異步編程 1.1 阻塞 程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)苦酱。 程序在等待某個(gè)操作完成...
    秦時(shí)明星閱讀 993評(píng)論 0 3
  • 錯(cuò)愕交加的那一瞬間 看到你冰清玉潔的皎面 心莫名地刺疼一下 像是回到了那段初戀 看著你溫溫柔柔的眼 無(wú)端地泛起繁星...
    采葭小妖閱讀 149評(píng)論 0 6