一個故事講完進(jìn)程毛肋、線程和協(xié)程

原文鏈接:https://www.toutiao.com/i6580123354085196302/

很久以前怨咪,有兩個程序,暫且稱他們旺財和小強吧润匙。

旺財和小強這兩個程序都很長诗眨,每個都有十幾萬行。 他們兩個的人生價值就是到CPU上去運行趁桃,把運行結(jié)果告訴人類辽话。

CPU是稀缺資源,只有一個卫病,他們倆必須排著隊油啤,輪流使用。

旺財從頭到尾執(zhí)行完了蟀苛,讓出CPU益咬, 讓小強從頭兒去執(zhí)行。

人類把這種處理方式叫做批處理帜平。

進(jìn)程

長久以來幽告,兩人相安無事。 后來CPU的速度越來越快裆甩, 遠(yuǎn)遠(yuǎn)超過了內(nèi)存冗锁,硬盤的速度。

人類想到嗤栓,這批處理系統(tǒng)的效率有點低啊冻河,你看當(dāng)小強需要從硬盤上讀取數(shù)據(jù)的時候箍邮,CPU也一直在等待,這是多大的浪費斑缎稹锭弊!這時候完全可以讓旺財來運行一下嘛!

當(dāng)然得保存好小強的執(zhí)行現(xiàn)場:具體執(zhí)行到那一行程序指令了擂错, 函數(shù)調(diào)用到什么層次了味滞,每個函數(shù)調(diào)用都有什么樣的參數(shù),CPU寄存器中的值..... 等等一系列東西钮呀。

如果不把小強的執(zhí)行現(xiàn)場給保存下來剑鞍,等到小強的數(shù)據(jù)從銀盤讀完了,就沒法回到中斷處來繼續(xù)執(zhí)行了行楞。

這個執(zhí)行現(xiàn)場攒暇,再加上小強的代碼,就是一個執(zhí)行中的程序子房,被稱為“進(jìn)程” 形用。

旺財和小強在運行的時候,也被改造成了進(jìn)程证杭。

人類還規(guī)定:進(jìn)程不能長時間占據(jù)CPU田度, 只能在CPU上執(zhí)行一小會兒,然后馬上切換到別的進(jìn)程去執(zhí)行解愤。

旺財和小強不以為意:不就是執(zhí)行一會兒镇饺,歇一會兒,然后繼續(xù)執(zhí)行嘛送讲!

但是他們不知道的是奸笤,由于CPU運行速度超快,旺財和小強雖然在不斷地切換運行哼鬓,在人類那緩慢的世界里看來监右,旺財和小強好像是同時在執(zhí)行一樣。 這就是并發(fā)异希。

(在人類看來健盒,小強和旺財似乎是在同時執(zhí)行)

多年以后,他們倆才真正地實現(xiàn)了并行: 在一個豪華電腦中称簿,每人都被分配了一個CPU 扣癣, 真正地同時執(zhí)行, 這是后話了憨降。

線程

這時候旺財已經(jīng)有了界面父虑,還能訪問網(wǎng)絡(luò),每當(dāng)它聯(lián)網(wǎng)的時候(這也是個非常非常耗時的操作)授药,就得把CPU讓給小強频轿。

即使旺財再次被調(diào)度執(zhí)行垂涯,由于網(wǎng)絡(luò)數(shù)據(jù)還沒有返回烁焙,他必須等待航邢,什么事情都做不了,在人類看來骄蝇,界面根本無法操作膳殷,旺財不響應(yīng)了! 氣得人類經(jīng)常把旺財kill掉九火。

旺財心里苦赚窃,他很納悶小強怎么就沒有問題,小強不是要讀寫硬盤嗎岔激? 那也是很慢的操作啊勒极。

小強說:“你傻啊,內(nèi)部只有一個執(zhí)行的流程虑鼎,一遇到耗時的操作就得等待辱匿,你看看我,內(nèi)部搞了兩個執(zhí)行流程(線程)炫彩,一個用來讀寫硬盤(T1)匾七,另外一個處理界面(T2)。我和操作系統(tǒng)商量好了江兢,如果T1在讀寫硬盤昨忆, 就可以調(diào)度我的T2來執(zhí)行,這樣界面至少還可以操作杉允。 ”

旺財覺得很有意思邑贴,也采用了類似辦法。

于是叔磷,一個進(jìn)程中至少有一個執(zhí)行的流程(主線程)拢驾,也可以開啟新的執(zhí)行流程(線程)。

線程變成了最小的調(diào)度單位世澜。

協(xié)程

這一天独旷,旺財被一個叫做生產(chǎn)者和消費者的問題折騰地死去活來,兩個線程寥裂,一個線程向隊列中放數(shù)據(jù)嵌洼,另外一個從隊列中取數(shù)據(jù),處理起兩個線程的協(xié)作就顯得很麻煩封恰,不但需要加鎖麻养,還得做好線程的通知和等待。

正在感慨多線程編程之難的時候诺舔, 旺財震驚地發(fā)現(xiàn)鳖昌,小強用了一個極為簡單的辦法把生產(chǎn)者备畦,消費者問題給解決了。

這個方法的代碼如下:

# 生產(chǎn)者

def producer(c):

#其他代碼

while True:

value = ...生成數(shù)據(jù)...

c.send(value)

# 消費者

def consumer():

#其他代碼

while True:

value = yield

print(value)

c = consumer()

producer(c)

“這....這怎么執(zhí)行啊许昨,那個yield是怎么回事懂盐?” 旺財表示不解。

“簡單啊糕档,你看那個生產(chǎn)者莉恼,是不是向消費者發(fā)送了數(shù)據(jù)? ” 小強說速那。

“對啊俐银,然后呢,生產(chǎn)者發(fā)送了數(shù)據(jù)以后端仰,會馬上進(jìn)行下一輪循環(huán)嗎捶惜?”

“這就是關(guān)鍵所在了,”小強說荔烧,“ 它們是這么執(zhí)行的:”

生產(chǎn)者發(fā)送數(shù)據(jù)吱七,暫停運行,不進(jìn)行下一輪循環(huán)

消費者其實一直在value = yield 那里等待茴晋,直到數(shù)據(jù)到來陪捷,現(xiàn)在數(shù)據(jù)來了,取出處理(value就是生產(chǎn)者發(fā)送過來的數(shù)據(jù))诺擅。

消費者在循環(huán)中再次yield市袖, 暫停執(zhí)行。

生產(chǎn)者繼續(xù)下一輪的循環(huán)烁涌,生成新的消息苍碟,發(fā)送給消費者。

旺財覺得很吃驚撮执,小強竟然可以讓一個正在執(zhí)行的程序暫停微峰,他不由得問道:“你這個暫停是真的停止了了,還是說只是像Java的yield那樣抒钱,讓出CPU進(jìn)入了就緒狀態(tài)蜓肆? 等待下次調(diào)度運行?”

“是真的暫停了谋币,程序就停在那里仗扬,等待運行控制權(quán)從對方那里轉(zhuǎn)移過來±俣睿”

“這不是操作系統(tǒng)干的事情嗎早芭? ” 旺財更加吃驚了。

“正是這樣诅蝶,” 小強得意地說:“我打算把類似生產(chǎn)者退个,消費者這樣的代碼稱為‘協(xié)程’募壕, 這個協(xié)程有個重要的特點,就是完全被我所調(diào)度和掌控语盈, 不用操作系統(tǒng)介入舱馅。”

“這個協(xié)程和線程似乎很像啊黎烈。每次協(xié)程停止執(zhí)行的時候习柠,也得保存現(xiàn)場,要不然沒法恢復(fù)執(zhí)行照棋。” 旺財說武翎。

“是啊烈炭,只是他們比線程更加輕量級,操作系統(tǒng)內(nèi)核不用參與宝恶,相當(dāng)于用戶態(tài)線程了符隙,協(xié)程的開銷極小,可以輕松地創(chuàng)建大量的協(xié)程來做事情垫毙。 對了霹疫,也許你注意到了,我這兩個協(xié)程是'合作式'的综芥,它們兩個同一時刻只能有一個在運行丽蝎。 實際上,我在底層可以用一個線程去執(zhí)行這兩個協(xié)程膀藐。 ”

旺財表示同意:“不錯屠阻,既然兩個程序可以'合作',那就不用加鎖了额各,也不用在代碼里寫什么wait和notify了国觉,在程序?qū)用妫梢杂猛降姆绞綄崿F(xiàn)異步的功能了虾啦! 代碼很清晰麻诀,我也搞個協(xié)程來玩玩吧!”

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傲醉,一起剝皮案震驚了整個濱河市蝇闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌需频,老刑警劉巖丁眼,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昭殉,居然都是意外死亡苞七,警方通過查閱死者的電腦和手機(jī)藐守,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹂风,“玉大人卢厂,你說我怎么就攤上這事』葑模” “怎么了慎恒?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撵渡。 經(jīng)常有香客問我融柬,道長,這世上最難降的妖魔是什么趋距? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任粒氧,我火速辦了婚禮,結(jié)果婚禮上节腐,老公的妹妹穿的比我還像新娘外盯。我一直安慰自己,他們只是感情好翼雀,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布饱苟。 她就那樣靜靜地躺著,像睡著了一般狼渊。 火紅的嫁衣襯著肌膚如雪箱熬。 梳的紋絲不亂的頭發(fā)上咐鹤,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天慎璧,我揣著相機(jī)與錄音,去河邊找鬼裆操。 笑死官地,一個胖子當(dāng)著我的面吹牛酿傍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驱入,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼赤炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亏较?” 一聲冷哼從身側(cè)響起莺褒,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雪情,沒想到半個月后遵岩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年尘执,在試婚紗的時候發(fā)現(xiàn)自己被綠了舍哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡誊锭,死狀恐怖表悬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丧靡,我是刑警寧澤蟆沫,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站温治,受9級特大地震影響饭庞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罐盔,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一但绕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惶看,春花似錦、人聲如沸六孵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劫窒。三九已至本今,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間主巍,已是汗流浹背冠息。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留孕索,地道東北人逛艰。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像搞旭,于是被迫代替她去往敵國和親散怖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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