協(xié)程

所有的代碼就是?線程來執(zhí)?的土至,?如有?段線程執(zhí)?的時間?谈飒,有起點 A 和終點 B,執(zhí)??段 Logic ?戶代碼肪凛,執(zhí)?到某點時需要做系統(tǒng)調(diào)?堰汉,做系統(tǒng)調(diào)?的時候就會在這?點阻塞辽社,然后執(zhí)?序就進?系統(tǒng)內(nèi)核狀態(tài),?戶線程就會在這地? Block翘鸭,剩下來的時間?就交給系統(tǒng)內(nèi)核去執(zhí)?了滴铅。

假如?戶線程被阻塞住的時候,系統(tǒng)調(diào)?不使?剩下來的時間?就乓,?把系統(tǒng)調(diào)?變成操作系統(tǒng)內(nèi)核的異步調(diào)?汉匙,那么它所使?的時間?實際上是操作系統(tǒng)內(nèi)部的?些時間?,后??段?戶線程的時間?就被空出來了生蚁,空出來的話阻塞那這個時間???浪費掉了噩翠,為什么??浪費掉了?第?種可能就是看使?什么樣的阻塞?式邦投,?種?式阻塞在那?直等?直等什么都不干伤锚,另外?種操作系統(tǒng)覺得剩下來時間?拿?交給別的程序或者線程去執(zhí)?,對于我們進程執(zhí)?來說這很顯然就是性能損失志衣。

所以能不能有這樣的?種模式屯援,當(dāng)程序執(zhí)?線程A執(zhí)?到?點的時候被阻塞了,然后發(fā)??次系統(tǒng)調(diào)?蠢涝,讓
這個系統(tǒng)調(diào)?異步執(zhí)?玄呛,剩下來的時間?不打算交回去,完成?次調(diào)度把這段時間?交給線程B執(zhí)?和二,當(dāng)系
統(tǒng)調(diào)?完成的時候有很多機制實現(xiàn)喚醒,?如說select耳胎、epoll這樣的?些機制惯吕,喚醒把結(jié)果返還給A。這樣的話可以在同?個線程執(zhí)?并發(fā)多個任務(wù)怕午,這些并發(fā)任務(wù)實際上是在?戶態(tài)完成的和操作系統(tǒng)?關(guān)

概念

利?異步機制利???在?戶態(tài)實現(xiàn)這種調(diào)度機制把阻塞的那段時間搶回來?來執(zhí)?其他的任務(wù)废登,當(dāng) B 任務(wù)執(zhí)?結(jié)束的時候下次再執(zhí)?的時候去會檢查epoll返回的事件,然后把A的結(jié)果返還給A郁惜,這樣?來我們在?戶空間實現(xiàn)多任務(wù)的調(diào)度?多任務(wù)調(diào)度是發(fā)?在?個線程上的堡距,我們把這種機制稱之為協(xié)程.

因為操作系統(tǒng)調(diào)度以系統(tǒng)線程為單位的,但是我們在操作系統(tǒng)以外?戶空間再實現(xiàn)?次調(diào)度兆蕉,它每次浪費的時間?都撿回來盡可能去執(zhí)?我們的代碼羽戒,我們可以把這種機制稱之為協(xié)程,就是它?線程粒度更?虎韵,因為它實際在線程上把線程的時間?劃分成多個塊在線程上再去執(zhí)?多個任務(wù)易稠,但是協(xié)程很顯然是串?的它不是真正意義上的并?,實際上是執(zhí)?A任務(wù)當(dāng)A任務(wù)阻塞的時候然后喚醒B任務(wù)包蓝,B任務(wù)完了以后可能做?次檢查看 A 的結(jié)果回沒回來驶社,很顯然它這種切換來實現(xiàn)多任務(wù)并發(fā)企量,協(xié)程本質(zhì)是串?的

原理

他和線程的原理是一樣的,當(dāng)a線程切換到b線程的時候亡电,需要將a線程的相關(guān)執(zhí)行進度壓入棧届巩,然后將b線程的執(zhí)行進度出棧,進入b的執(zhí)行序列份乒。協(xié)程只不過是在應(yīng)用成實現(xiàn)這一點姆泻。

協(xié)程是基于線程的。內(nèi)部實現(xiàn)上冒嫡,維護了一組數(shù)據(jù)結(jié)構(gòu)和n個線程拇勃,真正的執(zhí)行還是線程,協(xié)程執(zhí)行的代碼被扔進一個待執(zhí)行隊列中孝凌,有這n個線程從隊列中拉出來執(zhí)行方咆。這就解決了協(xié)程的執(zhí)行問題。那么協(xié)程是怎么切換的呢蟀架?答案是:golang對各種io函數(shù)進行了封裝瓣赂,這些封裝的函數(shù)提供給應(yīng)用程序使用,而其內(nèi)部調(diào)用了操作系統(tǒng)的異步io函數(shù)片拍,當(dāng)這些異步函數(shù)返回busy或bloking時煌集,golang利用這個時機將現(xiàn)有的執(zhí)行序列壓棧,讓線程去拉另外一個協(xié)程的代碼來執(zhí)行捌省,基本原理就是這樣苫纤,利用并封裝了操作系統(tǒng)的異步函數(shù)。包括linux的epoll纲缓,select和windows的iocp,event等卷拘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祝高,隨后出現(xiàn)的幾起案子栗弟,更是在濱河造成了極大的恐慌,老刑警劉巖工闺,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍赫,死亡現(xiàn)場離奇詭異,居然都是意外死亡陆蟆,警方通過查閱死者的電腦和手機雷厂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遍搞,“玉大人罗侯,你說我怎么就攤上這事∠常” “怎么了钩杰?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵纫塌,是天一觀的道長。 經(jīng)常有香客問我讲弄,道長措左,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任避除,我火速辦了婚禮怎披,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓶摆。我一直安慰自己凉逛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布群井。 她就那樣靜靜地躺著状飞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪书斜。 梳的紋絲不亂的頭發(fā)上诬辈,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音荐吉,去河邊找鬼焙糟。 笑死,一個胖子當(dāng)著我的面吹牛样屠,可吹牛的內(nèi)容都是我干的穿撮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼瞧哟,長吁一口氣:“原來是場噩夢啊……” “哼混巧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勤揩,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秘蛔,沒想到半個月后陨亡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡深员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年负蠕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦畅。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡遮糖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叠赐,到底是詐尸還是另有隱情欲账,我是刑警寧澤屡江,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赛不,受9級特大地震影響惩嘉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踢故,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一文黎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殿较,春花似錦耸峭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帚戳,卻和暖如春玷或,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背片任。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工偏友, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人对供。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓位他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親产场。 傳聞我的和親對象是個殘疾皇子鹅髓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 輕量級線程:協(xié)程 在常用的并發(fā)模型中窿冯,多進程、多線程确徙、分布式是最普遍的醒串,不過近些年來逐漸有一些語言以first-c...
    Tenderness4閱讀 6,365評論 2 10
  • 原文鏈接:https://github.com/EasyKotlin 在常用的并發(fā)模型中,多進程鄙皇、多線程芜赌、分布式是...
    JackChen1024閱讀 10,738評論 3 23
  • 本文主要介紹協(xié)程的用法, 以及使用協(xié)程能帶來什么好處. 另外, 也會粗略提一下協(xié)程的大致原理.本文的意義可能僅僅是...
    登高而望遠(yuǎn)閱讀 35,226評論 18 140
  • Coroutine in Python 引言: 本文出自David Beazley 的關(guān)于協(xié)程的PPT,現(xiàn)在筆者將...
    LumiaXu閱讀 1,605評論 4 8
  • 多進程/線程 最早的服務(wù)器端程序都是通過多進程伴逸、多線程來解決并發(fā)IO的問題缠沈。進程模型出現(xiàn)的最早,從Unix 系統(tǒng)誕...
    Newt0n閱讀 15,259評論 9 69