五. 併發編程 (進程信號量)

一. 進程信號量( multiprocessing.Semaphore

1. 信號量概念(至關於在鎖的基礎上增長計數器)服務器

鎖的概念同樣 ,只不過能夠設置鑰匙的數量
上述講的Lock,屬於互斥鎖,也就是一把鑰匙配備一把鎖,同時只容許鎖住某一個數據。而信號量則是多把鑰匙配備多把鎖,也就是說同時容許鎖住多個數據。
好比在一個粉紅髮廊,裏邊有5位服務人員,那麼這個髮廊最多就同時容許進入5位客人,當又有第6位客人來的時候,就須要在門外等待;當服務人員服務完某位客人後,
才容許後續的人再進來一個,換句話說,這個髮廊最多同時接待5位客人,多的客人必須等待。 信號量同步基於內部計數器,用戶初始化一個計數器初值(好比上述例子中就初始化爲5)每調用一次acquire(),計數器減1;每調用一次release(),計數器加1。
當計數器爲0時,acquire()調用被阻塞。這是迪科斯徹(Dijkstra)信號量概念P()和V()的Python實現。信號量同步機制適用於訪問像服務器這樣的有限資源。
信號量與進程池的概念很像,可是要區分開,信號量涉及到加鎖的概念

2. multiprocessing.Semaphoredom

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

def fn(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

def fn(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歸還鑰匙-----
相關文章
相關標籤/搜索