join控制子進程
我們通過例子來:


最后的10封郵件發(fā)送完畢我是想等所有子進程運行完畢再打印,但是從運行結果來看,這并沒有達到我們的預期,因為父進程和子進程是異步的。
聰明的小明問了:那我在最后的print語句之前讓程序休眠不就好了?

非常聰明,但是治標不治本,這樣做只是讓程序陷入了休眠狀態(tài),但是并沒有從根本上解決異步的問題,它們還是異步,只是異步到了休眠。
這時我們可以用上join()方法:

得到的運行結果:

原理:
join()方法表示為給進程添加阻塞,也就是進程運行到這里就會停滯。再沒有用上join方法之前,for循環(huán)會同時創(chuàng)建這10個進程,但是用上了join方法之后,必須依次執(zhí)行循環(huán),因為第一次創(chuàng)建進程到了join()就會阻塞,直到第一次進程完成,join方法才會釋放阻塞,開始第二次循環(huán),如此往復執(zhí)行十次。
但是:
從根本上上來講,join方法幫我們把異步變成了同步,雖然可以更加有序,但是并沒有給我增加效率,異步的同時執(zhí)行還是我們需要的,因為可以節(jié)省時間。而join方法將異步編程同步之后,反而拖累了工作效率。
當然,也有解決的辦法:


將進程全部添加到一個列表中,進程啟動的時候仍然是異步,只有結束時所有的阻塞都解除了,主程序才能執(zhí)行。
守護進程
守護進程(daemon)是一類在后臺運行的特殊進程,是一個在后臺運行并且不受任何終端控制的進程。用于執(zhí)行特定的系統(tǒng)任務。很多守護進程在系統(tǒng)引導的時候啟動,并且一直運行直到系統(tǒng)關閉。另一些只在需要的時候才啟動,完成任務后就自動結束。守護進程最重要的特性是后臺運行。


換言之,守護進程會隨著主進程代碼的執(zhí)行完畢而結束。
我們再看一段:


效果也是一樣的,只是多了一個func2,這里只有func1是守護進程。所以守護進程在主進程代碼執(zhí)行完畢時就結束了,而func2不是守護進程,所以可以繼續(xù)運行。
可能有小明會很疑惑,守護進程到底有什么用?
守護進程其實可以作為程序的報活,每隔一段時間向一臺機器匯報自己的狀態(tài),死了就不匯報了。(先這樣理解吧)
進程鎖-LOCK
Lock鎖,什么叫Lock鎖,我們還是通過一個直觀的例子來。
我們建一個json文件,來模擬搶票,是的,就是搶票:
建一個json文件
{'count':2} #表示余量為2
實現(xiàn)搶票




明明只有兩張票,卻都搶到了。。。。

但我們仔細看,其實json文件中只修改了一次數(shù)據(jù)。因為這是一個異步程序,五個用戶同時打開并且讀取了json文件的內(nèi)容,也就是說數(shù)據(jù)的修改是在外部的,而不是在json文件內(nèi),只要同時打開并讀取,那么一開始五個用戶讀取到的內(nèi)容都是一樣的{'count':2},五個用戶又都在外面對數(shù)據(jù)進行修改,修改完了再保存回去,也就是五個人保存的數(shù)據(jù)都是{'count':1},發(fā)生了覆蓋現(xiàn)象,當涉及數(shù)據(jù)的修改時,異步其實很不安全。
所以我們可以采用加鎖(互斥鎖,這里是進程的互斥鎖,線程也有鎖)的方法。互斥鎖是一種簡單的加鎖的方法來控制對共享資源的訪問,互斥鎖只有兩種狀態(tài),即上鎖( lock )和解鎖( unlock )。原理為:

沒有上鎖的時候,用戶可以一起涌入數(shù)據(jù)文件,對數(shù)據(jù)文件內(nèi)的信息進行修改。但是當上鎖之后,訪問數(shù)據(jù)文件就只有一個通道了,雖然大家都是同時發(fā)起訪問的,但是進入數(shù)據(jù)文件的的用戶只能有一個,然后等這個用戶修改完了退出文件之后,通道才會開放給其他用戶。程序還是異步的,只是在數(shù)據(jù)修改環(huán)節(jié)限制了流量。



這就使得異步的程序達到了同步的效果。
信號量-Semaphore
互斥鎖(Lock)同時只允許一個進程修改數(shù)據(jù),而信號量(Semaphore)則允許多個人同時修改數(shù)據(jù)。互斥鎖就相當于你家的衛(wèi)生間,只有一個坑位,同時只能一個人上廁所;而信號量則相當于公共廁所,有多個坑位,可以多個人同時上廁所。比如現(xiàn)在有10個人需要上廁所,現(xiàn)在公共廁所只有3個坑位,這時候就先有3個人上廁所,等其中一個或者多個人出來之后,另外的人才能進去。
Semaphore管理一個內(nèi)置的計數(shù)器,每當調用acquire()時內(nèi)置計數(shù)器-1;調用release() 時內(nèi)置計數(shù)器+1;計數(shù)器不能小于0;當計數(shù)器為0時,acquire()將阻塞進程直到其他進程調用release()



事件-Event
再來一個紅燈停綠燈行:



審核編輯:劉清
-
計數(shù)器
+關注
關注
32文章
2315瀏覽量
98170 -
Lock
+關注
關注
0文章
11瀏覽量
8042 -
進程
+關注
關注
0文章
211瀏覽量
14532 -
信號量
+關注
關注
0文章
53瀏覽量
8769
發(fā)布評論請先 登錄
24位或者說高分辨率的AD到底有什么用呢?
Linux守護進程
64-Kbit FRAM是什么?64-Kbit FRAM到底有什么用途?
筆記本固態(tài)硬盤到底有什么用呢
異常處理向量表的設置中DCD這些偽指令到底有什么用?
數(shù)據(jù)可視化到底有什么用?
NFC是什么NFC到底有什么用處
log2在verilog中到底有什么用
npu是什么意思?npu芯片是什么意思?npu到底有什么用?
IPv6到底有什么用,給我們生活帶來哪些變化?
守護進程到底有什么用?
評論