python記錄_day31 程序同步和程序通訊
一、程序同步
1、同步鎖(又叫互斥鎖)
加鎖的程式碼以後,同一時間內只能被一個程序執行
1 from multiprocessing import Process, Lock 2 3 def fun(loc): 4 5 loc.acquire() #加鎖 6 pass #這裡的程式碼只能被一個程序執行 7 loc.release() #釋放鎖 8 9 10 if __name__ =="__mian__": 11 12 loc = Locke() #加鎖語法建立鎖物件 13 p = Process(target=fun,args=(loc,)) 14 p.start()
2、訊號量
訊號量相當於有多把鑰匙的鎖。同一時間允許多個程序執行加鎖的程式碼
訊號量中有一個計數器,進來一個程序計數器+1,出去一個程序計數器-1
1 from multiprocessing import Process, Semaphore 2 3 def fun(): 4 5 s.acquire() #訊號量中計數器+1 6 pass #訊號量語法這裡的程式碼最多能被4個程序同時執行 7 s.release() #訊號量中計數器-1 8 9 if __name__ =="__main__": 10 s = Semaphore(4) 11 p = Process(target=fun,args=(m,)) 12 p.start()
3、事件
e = Event() 建立一個事件物件,有兩個狀態,True和False,預設是False
e.wait() 事件狀態為false時等待
e.set() 將事件狀態設定為True
e.clear() 將事件狀態改為False
二、程序通訊
1、守護程序
將一個程序設定為守護程序: p.daemon = True
# 正常情況下,子程序和主程序非同步執行,所以子程序的執行不會受主程序狀態的影響,但設為守護程序後,守護程序會隨著主程序程式碼的結束而結束。
# 主程序程式碼結束不意味著主程序結束,主程序是要等子程序都結束才結束的,給子程序收屍。
# 如果一個子程序設定為了守護程序,它裡面就不能再開子程序了。
2、佇列
佇列是程序安全的。因為它裡邊的資料取一次就沒了,在程序通訊是推薦使用。
q = Queue(n) 建立對列物件,能容納 n 個元素
q.put() 往佇列中新增資料,對列滿時會等待
q.get() 從對列中取資料,對列空時會等待
q.full() 判斷對列是否滿了
q.empty() 判斷對列是否為空
q.get_nowait() 或 q.get(False) 取資料時不等待
q.put_nowait() 或 q.put(False) 新增資料時不等待
3、生產者消費者模型
就是使用緩衝區將多個程序解耦
一般使用對列,一個程序往裡放資料,一個程序取資料,也就是一個生產,一個消費
4、joinablequeue
升級版對列,比佇列多了兩個方法task_done和join,其他用法一樣
q.task_done() 給對列傳送一個訊號
q.join() 對列接收一個訊號
joinablequele相當於內部有一個計數器,put一個數據,計數器+1,然後取一個數據後用task_done()發一個訊號,join接收訊號,程式阻塞,當jion接收到和計數器相同的訊號數量時結束阻塞。