Python的互斥鎖與訊號量詳解
阿新 • • 發佈:2020-01-09
併發與鎖
多個執行緒共享資料的時候,如果資料不進行保護,那麼可能出現數據不一致現象,使用鎖,訊號量、條件鎖
互斥鎖
1. 互斥鎖,是使用一把鎖把程式碼保護起來,以犧牲效能換取程式碼的安全性,那麼Rlock後 必須要relase 解鎖 不然將會失去多執行緒程式的優勢
2. 互斥鎖的基本使用規則:
import threading # 宣告互斥鎖 lock=threading.Rlock(); def handle(sid):# 功能實現程式碼 lock.acquire() #加鎖 # writer codeing lock.relase() #釋放鎖
訊號量:
1. 呼叫relarse()訊號量會+1 呼叫 acquire() 訊號量會-1
可以理解為對於臨界資源的使用,以及進入臨界區的判斷條件
2. semphore() :當呼叫relarse()函式的時候 單純+1 不會檢查訊號量的上限情況。 初始引數為0
3. boudedsemphore():邊界訊號量 當呼叫relarse() 會+1,並且會檢查訊號量的上限情況。不允許超過上限
使用budedsemaphore時候不允許設定初始為0,將會丟擲異常
至少設定為1 ,如consumer product 時候應該在外設定一個變數,啟動時候對變數做判斷,決定使不使用acquier
4. 訊號量的基本使用程式碼:
# 宣告訊號量: sema=threading.Semaphore(0); #無上限檢查 sema=threading.BuderedSeamphore(1) #有上限檢查設定 5 apple=1 def consumner(): seam.acquire(); # ‐1 9 if apple==1: pass else: sema2.release();#+ 1 def product(): seam.relarse(); # +1 if apple==1: pass else: print("消費:",apple);
全部的程式碼:
# -*- coding: utf-8 -*- """ Created on Mon Sep 9 21:49:30 2019 @author: DGW-PC """ # 訊號量解決生產者消費者問題 import random; import threading; import time; # 宣告訊號量 sema=threading.Semaphore(0);# 必須寫引數 0 表示可以使用數 sema2=threading.BoundedSemaphore(1); apple=1; def product():#生產者 global apple; apple=random.randint(1,100); time.sleep(3); print("生成蘋果:",apple); #sema2.release(); # +1 if apple==1: pass else: sema2.release();#+ 1 def consumer(): print("等待"); sema2.acquire();# -1 if apple==1: pass else: print("消費:",apple); threads=[]; for i in range(1,3): t1=threading.Thread(target=consumer); t2=threading.Thread(target=product); t1.start(); t2.start(); threads.append(t1); threads.append(t2); for x in threads: x.join();
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。