五 併發程式設計 程序訊號量

2022-07-13 17:27:12 字數 3238 閱讀 9648

1. 訊號量概念(相當於在鎖的基礎上增加計數器)

鎖的概念一樣 ,只不過可以設定鑰匙的數量
上述講的lock,屬於互斥鎖,也就是一把鑰匙配備一把鎖,同時只允許鎖住某乙個資料。而訊號量則是多把鑰匙配備多把鎖,也就是說同時允許鎖住多個資料。

比如在乙個粉紅髮廊,裡邊有5位服務人員,那麼這個髮廊最多就同時允許進入5位客人,當又有第6位客人來的時候,就需要在門外等待;當服務人員服務完某位客人後,

才允許後續的人再進來乙個,換句話說,這個髮廊最多同時接待5位客人,多的客人必須等待。訊號量同步基於內部計數器,使用者初始化乙個計數器初值(比如上述例子中就初始化為5)每呼叫一次acquire(),計數器減1;每呼叫一次release(),計數器加1。

當計數器為0時,acquire()呼叫被阻塞。這是迪科斯徹(dijkstra)訊號量概念p()和v()的python實現。訊號量同步機制適用於訪問像伺服器這樣的有限資源。

訊號量與程序池的概念很像,但是要區分開,訊號量涉及到加鎖的概念

2. multiprocessing.semaphore

import

time

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

第五把鑰匙

") #

不列印#

#第一把鑰匙

#第二把鑰匙

#第三把鑰匙

#第四把鑰匙

import

time

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

第五個人

') #

第五個無法列印

#因為只有四把鑰匙,只能有四個程序進去 , 當前程序時第五個 所有進不去

#執行結果

第乙個人

第二個人

第三個人

第四個人

第乙個人

第二個人

第三個人

第四個人

第乙個人

第二個人

第三個人

第四個人

第乙個人

第二個人

第三個人

第四個人

import

time

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 新增乙個許可,從而可能釋放乙個正在阻塞的獲取者。但是,不...