python學習之訊號量

testingbang發表於2020-05-06

如果想要 控制同時訪問資源的數量,我們可以怎麼做呢?本篇文章將透過 訊號量的操作來達到這一需求。希望感興趣的小夥伴可以堅持看下去同時歡迎提出寶貴的意見讓我們一起進步!

01:訊號量

1)概述:訊號量是用來 控制執行緒併發數的。

2)原理:BoundedSemaphore和Semaphore管理一個內建的計數器。每當 資源釋放遞增時(呼叫acquire)計數器-1,資源消耗時遞減(呼叫release)計數器+1

3)呼叫格式: threading.BoundedSemaphore/Semaphore(value);值預設1

4)使用場景: 停車位(固定的停車位,車位全部被佔用則進不來;只有車子離開其餘車才能進來)

5)BoundedSemaphore和Semaphore區別: 前者將在呼叫release()時檢查計數器的值是否超過了計數器的初始值,如果超過將丟擲一個異常

6)注意事項: 計數器不能小於0,當計數器為0時:acquire()將阻塞執行緒至同步鎖定狀態,直到其他執行緒呼叫release()

02:案例操作
停車場只有3個停車位。來了5輛汽車需要停車這時候就使用Semaphore來控制訪問量了

只能同時允許3輛車同時進入停車場,第4輛車只有等先進入的3輛車中有車出來才可進入
import threading,time,random

semaphore=threading.Semaphore(3)#同一時間只能有3個執行緒處於執行狀態
def run (ii):
   semaphore.acquire() # 獲得訊號量:訊號量減一
   print(ii,'號車可以進入')
   time.sleep(random.randint(0,10)*1)
   print(ii,'號停車位釋放')
   semaphore.release()# 釋放訊號量:訊號量加一
for i in range(5):#建立5個執行緒
   t=threading.Thread(target=run,args=(i,))
   t.start()
03:BoundedSemaphore和Semaphore區別案例操作

BoundedSemaphore呼叫時如果計數器的值超過了初始值會丟擲異常;但是Semaphore不會

import threading,time,random

semaphore=threading.BoundedSemaphore(3)#同一時間只能有3個執行緒處於執行狀態
def run (ii):
   semaphore.acquire() # 獲得訊號量:訊號量減一
   print(ii,'號車可以進入')
   time.sleep(random.randint(0,10)*1)
   print(ii,'號停車位釋放')
   #***************此處高能******************
   semaphore.release()# 釋放訊號量:訊號量加一
   # 再次釋放訊號量:訊號量加一,這時超過限定的訊號量數目會報錯ValueError: Semaphore released too many times
   semaphore.release()
   #***************高能結束******************
for i in range(5):#建立5個執行緒
   t=threading.Thread(target=run,args=(i,))
   t.start()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2690003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章