join控制子進(jìn)程
我們通過例子來:
最后的10封郵件發(fā)送完畢我是想等所有子進(jìn)程運(yùn)行完畢再打印,但是從運(yùn)行結(jié)果來看,這并沒有達(dá)到我們的預(yù)期,因?yàn)楦高M(jìn)程和子進(jìn)程是異步的。
聰明的小明問了:那我在最后的print語句之前讓程序休眠不就好了?
非常聰明,但是治標(biāo)不治本,這樣做只是讓程序陷入了休眠狀態(tài),但是并沒有從根本上解決異步的問題,它們還是異步,只是異步到了休眠。
這時(shí)我們可以用上join()方法:
得到的運(yùn)行結(jié)果:
原理:
join()方法表示為給進(jìn)程添加阻塞,也就是進(jìn)程運(yùn)行到這里就會(huì)停滯。再?zèng)]有用上join方法之前,for循環(huán)會(huì)同時(shí)創(chuàng)建這10個(gè)進(jìn)程,但是用上了join方法之后,必須依次執(zhí)行循環(huán),因?yàn)榈谝淮蝿?chuàng)建進(jìn)程到了join()就會(huì)阻塞,直到第一次進(jìn)程完成,join方法才會(huì)釋放阻塞,開始第二次循環(huán),如此往復(fù)執(zhí)行十次。
但是:
從根本上上來講,join方法幫我們把異步變成了同步,雖然可以更加有序,但是并沒有給我增加效率,異步的同時(shí)執(zhí)行還是我們需要的,因?yàn)榭梢怨?jié)省時(shí)間。而join方法將異步編程同步之后,反而拖累了工作效率。
當(dāng)然,也有解決的辦法:
將進(jìn)程全部添加到一個(gè)列表中,進(jìn)程啟動(dòng)的時(shí)候仍然是異步,只有結(jié)束時(shí)所有的阻塞都解除了,主程序才能執(zhí)行。
守護(hù)進(jìn)程
守護(hù)進(jìn)程(daemon)是一類在后臺(tái)運(yùn)行的特殊進(jìn)程,是一個(gè)在后臺(tái)運(yùn)行并且不受任何終端控制的進(jìn)程。用于執(zhí)行特定的系統(tǒng)任務(wù)。很多守護(hù)進(jìn)程在系統(tǒng)引導(dǎo)的時(shí)候啟動(dòng),并且一直運(yùn)行直到系統(tǒng)關(guān)閉。另一些只在需要的時(shí)候才啟動(dòng),完成任務(wù)后就自動(dòng)結(jié)束。守護(hù)進(jìn)程最重要的特性是后臺(tái)運(yùn)行。
換言之,守護(hù)進(jìn)程會(huì)隨著主進(jìn)程代碼的執(zhí)行完畢而結(jié)束。
我們?cè)倏匆欢危?/p>
效果也是一樣的,只是多了一個(gè)func2,這里只有func1是守護(hù)進(jìn)程。所以守護(hù)進(jìn)程在主進(jìn)程代碼執(zhí)行完畢時(shí)就結(jié)束了,而func2不是守護(hù)進(jìn)程,所以可以繼續(xù)運(yùn)行。
可能有小明會(huì)很疑惑,守護(hù)進(jìn)程到底有什么用?
守護(hù)進(jìn)程其實(shí)可以作為程序的報(bào)活,每隔一段時(shí)間向一臺(tái)機(jī)器匯報(bào)自己的狀態(tài),死了就不匯報(bào)了。(先這樣理解吧)
進(jìn)程鎖-LOCK
Lock鎖,什么叫Lock鎖,我們還是通過一個(gè)直觀的例子來。
我們建一個(gè)json文件,來模擬搶票,是的,就是搶票:
建一個(gè)json文件
{'count':2} #表示余量為2
實(shí)現(xiàn)搶票
明明只有兩張票,卻都搶到了。。。。
但我們仔細(xì)看,其實(shí)json文件中只修改了一次數(shù)據(jù)。因?yàn)檫@是一個(gè)異步程序,五個(gè)用戶同時(shí)打開并且讀取了json文件的內(nèi)容,也就是說數(shù)據(jù)的修改是在外部的,而不是在json文件內(nèi),只要同時(shí)打開并讀取,那么一開始五個(gè)用戶讀取到的內(nèi)容都是一樣的{'count':2},五個(gè)用戶又都在外面對(duì)數(shù)據(jù)進(jìn)行修改,修改完了再保存回去,也就是五個(gè)人保存的數(shù)據(jù)都是{'count':1},發(fā)生了覆蓋現(xiàn)象,當(dāng)涉及數(shù)據(jù)的修改時(shí),異步其實(shí)很不安全。
所以我們可以采用加鎖(互斥鎖,這里是進(jìn)程的互斥鎖,線程也有鎖)的方法。互斥鎖是一種簡單的加鎖的方法來控制對(duì)共享資源的訪問,互斥鎖只有兩種狀態(tài),即上鎖( lock )和解鎖( unlock )。原理為:
沒有上鎖的時(shí)候,用戶可以一起涌入數(shù)據(jù)文件,對(duì)數(shù)據(jù)文件內(nèi)的信息進(jìn)行修改。但是當(dāng)上鎖之后,訪問數(shù)據(jù)文件就只有一個(gè)通道了,雖然大家都是同時(shí)發(fā)起訪問的,但是進(jìn)入數(shù)據(jù)文件的的用戶只能有一個(gè),然后等這個(gè)用戶修改完了退出文件之后,通道才會(huì)開放給其他用戶。程序還是異步的,只是在數(shù)據(jù)修改環(huán)節(jié)限制了流量。
這就使得異步的程序達(dá)到了同步的效果。
信號(hào)量-Semaphore
互斥鎖(Lock)同時(shí)只允許一個(gè)進(jìn)程修改數(shù)據(jù),而信號(hào)量(Semaphore)則允許多個(gè)人同時(shí)修改數(shù)據(jù)?;コ怄i就相當(dāng)于你家的衛(wèi)生間,只有一個(gè)坑位,同時(shí)只能一個(gè)人上廁所;而信號(hào)量則相當(dāng)于公共廁所,有多個(gè)坑位,可以多個(gè)人同時(shí)上廁所。比如現(xiàn)在有10個(gè)人需要上廁所,現(xiàn)在公共廁所只有3個(gè)坑位,這時(shí)候就先有3個(gè)人上廁所,等其中一個(gè)或者多個(gè)人出來之后,另外的人才能進(jìn)去。
Semaphore管理一個(gè)內(nèi)置的計(jì)數(shù)器,每當(dāng)調(diào)用acquire()時(shí)內(nèi)置計(jì)數(shù)器-1;調(diào)用release() 時(shí)內(nèi)置計(jì)數(shù)器+1;計(jì)數(shù)器不能小于0;當(dāng)計(jì)數(shù)器為0時(shí),acquire()將阻塞進(jìn)程直到其他進(jìn)程調(diào)用release()
事件-Event
再來一個(gè)紅燈停綠燈行:
審核編輯:劉清
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94679 -
Lock
+關(guān)注
關(guān)注
0文章
10瀏覽量
7776 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
203瀏覽量
13964 -
信號(hào)量
+關(guān)注
關(guān)注
0文章
53瀏覽量
8354
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論