1. 程式人生 > 程式設計 >Python的互斥鎖與訊號量詳解

Python的互斥鎖與訊號量詳解

併發與鎖

多個執行緒共享資料的時候,如果資料不進行保護,那麼可能出現數據不一致現象,使用鎖,訊號量、條件鎖

互斥鎖

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();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。