python之執行緒鎖與訊號量
阿新 • • 發佈:2018-11-10
執行緒鎖(互斥鎖Mutex)
一個程序下可以啟動多個執行緒,多個執行緒共享父程序的記憶體空間,也就意味著每個執行緒可以訪問同一份資料,此時,如果2個執行緒同時要修改同一份資料,會出現什麼狀況?就會可能存在同時取出了一個數據進行操作,然後存回去,這樣就會丟失一次操作。所以用鎖,在修改之前鎖上資料,修改之後再釋放鎖,期間別人不能使用這個資料。
例子:
import threading num = 0 #全域性變數 lock = threading.Lock() #生成全域性鎖 def add(): global num # 在每個執行緒中都獲取這個全域性變數 lock.acquire() # 修改資料前加鎖 num += 1 # 對此公共變數進行+1操作 lock.release() # 修改後釋放 thread_list = [] for i in range(100): t = threading.Thread(target=add) t.start() thread_list.append(t) for t in thread_list: # 等待所有執行緒執行完畢 t.join() print('final num:', num)
執行緒鎖只允許同一時刻一個執行緒修改變數,如果要在同一時刻允許多個執行緒修改變數,用訊號量。
訊號量Semaphore
執行緒鎖同時只允許一個執行緒更改資料,而訊號量是同時允許一定數量的執行緒更改資料 。
import threading, time #訊號量 def run(n): semaphore.acquire() time.sleep(1) #控制每個執行緒1秒執行時間 print("run the thread: %s\n" % n) semaphore.release() semaphore = threading.BoundedSemaphore(3) # 最多允許5個執行緒同時執行 for i in range(20): t = threading.Thread(target=run, args=(i,)) t.start() while threading.active_count() != 1: #還有執行緒在活動就不結束 pass else: print('----all threads done---')