1. 訊號量概念(相當於在鎖的基礎上增加計數器)
鎖的概念一樣 ,只不過可以設定鑰匙的數量
上述講的lock,屬於互斥鎖,也就是一把鑰匙配備一把鎖,同時只允許鎖住某乙個資料。而訊號量則是多把鑰匙配備多把鎖,也就是說同時允許鎖住多個資料。比如在乙個粉紅髮廊,裡邊有5位服務人員,那麼這個髮廊最多就同時允許進入5位客人,當又有第6位客人來的時候,就需要在門外等待;當服務人員服務完某位客人後,
才允許後續的人再進來乙個,換句話說,這個髮廊最多同時接待5位客人,多的客人必須等待。訊號量同步基於內部計數器,使用者初始化乙個計數器初值(比如上述例子中就初始化為5),每呼叫一次acquire(),計數器減1;每呼叫一次release(),計數器加1。
當計數器為0時,acquire()呼叫被阻塞。這是迪科斯徹(dijkstra)訊號量概念p()和v()的python實現。訊號量同步機制適用於訪問像伺服器這樣的有限資源。
訊號量與程序池的概念很像,但是要區分開,訊號量涉及到加鎖的概念
2. multiprocessing.semaphore
importtime
import
random
from multiprocessing import
process
from multiprocessing import
semaphore
aa=semaphore(4)
aa.acquire()
print("
第一把鑰匙")
aa.acquire()
print("
第二把鑰匙")
aa.acquire()
print("
第三把鑰匙")
aa.acquire()
print("
第四把鑰匙")
aa.acquire()
print("
第五把鑰匙
") #
不列印#
#第一把鑰匙
#第二把鑰匙
#第三把鑰匙
#第四把鑰匙
importtime
import
random
from multiprocessing import
process
from multiprocessing import
semaphore
deffn(i, sem):
sem.acquire()
#拿鑰匙
print('
%s拿到鑰匙!!!!!!
' %(i))
time.sleep(random.randint(1, 5))
print('
%s歸還鑰匙-----
' %(i))
sem.release()
#還鑰匙
if__name__ == '
__main__':
sem = semaphore(4) #
也是同步 和鎖的概念一樣
for i in range(3):
p = process(target=fn, args=(i, sem))
p.start()
sem = semaphore(4)
sem.acquire()
print('
第乙個人')
sem.acquire()
print('
第二個人')
sem.acquire()
print('
第三個人')
sem.acquire()
print('
第四個人')
sem.acquire()
print('
第五個人
') #
第五個無法列印
#因為只有四把鑰匙,只能有四個程序進去 , 當前程序時第五個 所有進不去
#執行結果
第乙個人
第二個人
第三個人
第四個人
第乙個人
第二個人
第三個人
第四個人
第乙個人
第二個人
第三個人
第四個人
第乙個人
第二個人
第三個人
第四個人
importtime
import
random
from multiprocessing import
process
from multiprocessing import
semaphore
deffn(i, sem):
sem.acquire()
#拿鑰匙
print('
%s拿到鑰匙!!!!!!
' %(i))
time.sleep(random.randint(1, 5))
print('
%s歸還鑰匙-----
' %(i))
sem.release()
#還鑰匙
if__name__ == '
__main__':
sem = semaphore(4) #
也是同步 和鎖的概念一樣
for i in range(10):
p = process(target=fn, args=(i, sem))
p.start()##
0拿到鑰匙!!!!!!
#1拿到鑰匙!!!!!!
#2拿到鑰匙!!!!!!
#3拿到鑰匙!!!!!!
#1歸還鑰匙-----
#4拿到鑰匙!!!!!!
#0歸還鑰匙-----
#6拿到鑰匙!!!!!!
#2歸還鑰匙-----
#5拿到鑰匙!!!!!!
#3歸還鑰匙-----
#7拿到鑰匙!!!!!!
#4歸還鑰匙-----
#8拿到鑰匙!!!!!!
#5歸還鑰匙-----
#9拿到鑰匙!!!!!!
#6歸還鑰匙-----
#7歸還鑰匙-----
#9歸還鑰匙-----
#8歸還鑰匙-----
39 併發程式設計 訊號量
一 定義 1 互斥鎖同時只允許乙個執行緒更改資料,而訊號量semaphore是同時允許一定數量的執行緒更改資料 假設商場裡有4個迷你唱吧,所以同時可以進去4個人,如果來了第五個人就要在外面等待,等到有人出來才能再進去玩。2 實現 訊號量同步基於內部計數器,每呼叫一次acquire 計數器減1 每呼叫...
併發程式設計 資源併發訪問訊號量
如果執行緒要訪問乙個共享資源,它必須先獲得訊號量。如果訊號量的內部計數器大於0,訊號量將減1,然後允許訪問這個共享資源,計數器大於0意味著有可以使用的資源。因此執行緒將被允許訪問使用其中乙個資源。如果訊號量的計數器等於0,訊號量將會把執行緒置入休眠直至計數器大於0,計數器等於0的時候以為著所有共享資...
併發程式設計回顧 訊號量Semaphore
原先多執行緒併發程式設計的學習筆記和 整理一下貼上來。訊號量semaphore 根據jdk文件描述 乙個計數訊號量。從概念上講,訊號量維護了乙個許可集。如有必要,在許可可用前會阻塞每乙個 acquire 然後再獲取該許可。每個 release 新增乙個許可,從而可能釋放乙個正在阻塞的獲取者。但是,不...