自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 開發(fā)工具
旺財(cái)和小強(qiáng)這兩個(gè)程序都很長,每個(gè)都有十幾萬行。 他們兩個(gè)的人生價(jià)值就是到CPU上去運(yùn)行,把運(yùn)行結(jié)果告訴人類。

很久以前,有兩個(gè)程序,暫且稱他們旺財(cái)和小強(qiáng)吧。

旺財(cái)和小強(qiáng)這兩個(gè)程序都很長,每個(gè)都有十幾萬行。 他們兩個(gè)的人生價(jià)值就是到CPU上去運(yùn)行,把運(yùn)行結(jié)果告訴人類。

[[231810]]

CPU是稀缺資源,只有一個(gè),他們倆必須排著隊(duì),輪流使用。

旺財(cái)從頭到尾執(zhí)行完了,讓出CPU, 讓小強(qiáng)從頭兒去執(zhí)行。

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

進(jìn)程

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

人類想到,這批處理系統(tǒng)的效率有點(diǎn)低啊,你看當(dāng)小強(qiáng)需要從硬盤上讀取數(shù)據(jù)的時(shí)候,CPU也一直在等待,這是多大的浪費(fèi)啊!這時(shí)候完全可以讓旺財(cái)來運(yùn)行一下嘛!

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

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

這個(gè)執(zhí)行現(xiàn)場,再加上小強(qiáng)的代碼,就是一個(gè)執(zhí)行中的程序,被稱為“進(jìn)程” 。

旺財(cái)和小強(qiáng)在運(yùn)行的時(shí)候,也被改造成了進(jìn)程。

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

旺財(cái)和小強(qiáng)不以為意:不就是執(zhí)行一會(huì)兒,歇一會(huì)兒,然后繼續(xù)執(zhí)行嘛!

但是他們不知道的是,由于CPU運(yùn)行速度超快,旺財(cái)和小強(qiáng)雖然在不斷地切換運(yùn)行,在人類那緩慢的世界里看來,旺財(cái)和小強(qiáng)好像是同時(shí)在執(zhí)行一樣。  這就是并發(fā)。

(在人類看來,小強(qiáng)和旺財(cái)似乎是在同時(shí)執(zhí)行)

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

線程

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

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

旺財(cái)心里苦,他很納悶小強(qiáng)怎么就沒有問題,小強(qiáng)不是要讀寫硬盤嗎? 那也是很慢的操作啊。

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

旺財(cái)覺得很有意思,也采用了類似辦法。

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

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

協(xié)程

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

正在感慨多線程編程之難的時(shí)候, 旺財(cái)震驚地發(fā)現(xiàn),小強(qiáng)用了一個(gè)極為簡單的辦法把生產(chǎn)者,消費(fèi)者問題給解決了。

這個(gè)方法的代碼如下:

  1. # 生產(chǎn)者 
  2. def producer(c):    
  3.     #其他代碼   
  4.     while True:           
  5.         value = ...生成數(shù)據(jù)... 
  6.         c.send(value) 
  7.  
  8. # 消費(fèi)者 
  9. def consumer():     
  10.     #其他代碼       
  11.     while True
  12.         value = yield  
  13.         print(value) 
  14.  
  15. c = consumer() 
  16. producer(c) 

“這....這怎么執(zhí)行啊,那個(gè)yield是怎么回事?”  旺財(cái)表示不解。

“簡單啊,你看那個(gè)生產(chǎn)者,是不是向消費(fèi)者發(fā)送了數(shù)據(jù)? ” 小強(qiáng)說。

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

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

  1. 生產(chǎn)者發(fā)送數(shù)據(jù),暫停運(yùn)行,不進(jìn)行下一輪循環(huán)
  2. 消費(fèi)者其實(shí)一直在value = yield 那里等待,直到數(shù)據(jù)到來,現(xiàn)在數(shù)據(jù)來了,取出處理(value就是生產(chǎn)者發(fā)送過來的數(shù)據(jù))。
  3. 消費(fèi)者在循環(huán)中再次yield, 暫停執(zhí)行。
  4. 生產(chǎn)者繼續(xù)下一輪的循環(huán),生成新的消息,發(fā)送給消費(fèi)者。

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

“是真的暫停了,程序就停在那里,等待運(yùn)行控制權(quán)從對(duì)方那里轉(zhuǎn)移過來。”

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

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

“這個(gè)協(xié)程和線程似乎很像啊。每次協(xié)程停止執(zhí)行的時(shí)候,也得保存現(xiàn)場,要不然沒法恢復(fù)執(zhí)行。” 旺財(cái)說。

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

旺財(cái)表示同意:“不錯(cuò),既然兩個(gè)程序可以'合作',那就不用加鎖了,也不用在代碼里寫什么wait和notify了,在程序?qū)用?,可以用同步的方式?shí)現(xiàn)異步的功能了! 代碼很清晰,我也搞個(gè)協(xié)程來玩玩吧!”

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)coderising獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2019-05-30 10:15:30

2023-12-13 09:56:13

?多進(jìn)程多線程協(xié)程

2023-12-17 14:24:46

計(jì)算機(jī)進(jìn)程線程

2024-10-22 15:34:57

2023-11-29 08:02:16

線程進(jìn)程

2013-04-25 09:55:21

進(jìn)程線程

2021-01-28 11:17:49

Python爬蟲單線程

2020-08-04 10:56:09

進(jìn)程線程協(xié)程

2020-11-29 17:03:08

進(jìn)程線程協(xié)程

2023-09-04 08:08:59

2019-09-18 15:09:50

進(jìn)程線程操作系統(tǒng)

2015-08-05 09:45:25

IOS故事多線程

2023-10-12 09:46:00

并發(fā)模型線程

2020-06-23 10:03:33

版本控制項(xiàng)目

2012-11-29 09:49:17

軟件項(xiàng)目項(xiàng)目

2023-07-03 07:27:41

進(jìn)程線程Win32

2024-09-27 11:03:38

2015-09-17 13:26:56

線程數(shù)進(jìn)程Linux

2015-08-13 14:35:43

2017-09-13 15:45:17

交付軟件遺留系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)