python學習之訊號量
如果想要 控制同時訪問資源的數量,我們可以怎麼做呢?本篇文章將透過 訊號量的操作來達到這一需求。希望感興趣的小夥伴可以堅持看下去同時歡迎提出寶貴的意見讓我們一起進步!
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- python 之訊號SignalPython
- rt-thread學習筆記——8、建立訊號量thread筆記
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- 原始碼分析:Semaphore之訊號量原始碼
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- Linux 程式間通訊之System V 訊號量Linux
- POSIX 訊號量
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- STM32的UCOS訊號量和互斥訊號量
- Python學習筆記|Python之程式Python筆記
- python學習之數字Python
- python學習之運算子Python
- Python 學習之元組Python
- Python學習之共享引用Python
- Python學習之set集合Python
- Python學習之正則Python
- Python學習之函式Python函式
- Python學習之模組Python
- Python-訊號量和執行緒池-semaphore ThreadPollPython執行緒thread
- django的訊號量Django
- liteos訊號量(八)
- Python學習筆記|Python之yield理解Python筆記
- Python學習筆記|Python之索引迭代Python筆記索引
- Python學習筆記|Python之特殊方法Python筆記
- 深度學習助力引力波訊號搜尋深度學習
- Python學習之zip函式Python函式
- Python學習之常用模組Python
- python庫學習之Requests(二)Python
- Python 學習之元組列表Python
- Python學習之 datetime模組Python
- Python學習之引數(一)Python
- pandas學習之Python基礎Python
- 深度學習、機器學習、python、C++視訊深度學習機器學習PythonC++
- 程序間通訊(4)-訊號量
- Python學習系列之學Python需要什麼軟體?Python
- 訊號量的使用 ManualResetEvent