1. 程式人生 > >python記錄_day31 程序同步和程序通訊

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接收到和計數器相同的訊號數量時結束阻塞。