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