鎖,訊號量,事件機制

2022-07-24 02:42:09 字數 3395 閱讀 9550

from multiprocessing import lock

l = lock()

l.acquire()# 拿走鑰匙,鎖門,不讓其他人進屋

l.release()# 釋放鎖。 還鑰匙,開門,允許其他人進屋

#執行乙個程序的時候不允許其他程序一起執行

舉例:兩個人在銀行共同存錢取錢

from multiprocessing import process,value,lock

import time

def get_money(num,l):# 取錢

l.acquire()# 拿走鑰匙,鎖上門,不允許其他人進屋

for i in range(100):

num.value -= 1

print(num.value)

time.sleep(0.01)

l.release()# 還鑰匙,開啟門,允許其他人進屋

def put_money(num,l):# 存錢

l.acquire()

for i in range(100):

num.value += 1

print(num.value)

time.sleep(0.01)

l.release()

if __name__ == '__main__':

num = value('i',100)

l = lock()

p = process(target=get_money,args=(num,l))

p.start()

p1 = process(target=put_money, args=(num,l))

p1.start()

p.join()

p1.join()

print(num.value)

value 程序間共享資料

訊號量

from multiprocessing import semaphore,lock

l = semaphore(4) #一把鎖對應多把鑰匙,引數是幾代表幾把鑰匙,沒有鑰匙的程序只有等其他程序還了鑰匙才能繼續執行

l.acquire()# 拿走1把鑰匙,鎖上門

print(123)

l.acquire()# 拿走1把鑰匙,鎖上門

print(456)

l.acquire()# 拿走1把鑰匙,鎖上門

print(789)

# l.release()

l.acquire()# 拿走1把鑰匙,鎖上門

print(120)

舉例:5個小黑屋,20個人進

from multiprocessing import process,semaphore

import time

import random

def func(i,sem):

sem.acquire()

print('第%s個人進入小黑屋,拿了鑰匙鎖上門' % i)

time.sleep(random.randint(3,5))

print('第%s個人出去小黑屋,還了鑰匙開啟門' % i)

sem.release()

if __name__ == '__main__':

sem = semaphore(5)# 初始化了一把鎖5把鑰匙,也就是說允許5個人同時進入小黑屋

# 之後其他人必須等待,等有人從小黑屋出來,還了鑰匙,才能允許後邊的人進入

for i in range(20):

p = process(target=func,args=(i,sem,))

p.start()

事件機制

from multiprocessing import event

e = event()

# e.set()

# e.clear()

# e.wait()

# e.is_set()

# 事件是通過is_set()的bool值,去標識e.wait() 的阻塞狀態

# 當is_set()的bool值為false時,e.wait()是阻塞狀態

# 當is_set()的bool值為true時,e.wait()是非阻塞狀態

# 當使用set()時,是把is_set的bool變為true

# 當使用clear()時,是把is_set的bool變為false

print(e.is_set())# false wait應該是阻塞住

e.set()# 將is_set 的bool值變為true,將wait變為非阻塞

e.wait()

print(e.is_set())

print(123)

e.clear()

print(e.is_set())

e.wait()

print(123)

舉例:訊號燈模擬,紅燈亮不允許車輛通過,綠燈通過

from multiprocessing import process,event

import time

import random

def tra(e):

'''訊號燈函式'''

# e.set()

# print('\033[32m 綠燈亮! \033[0m')

while 1:# 紅綠燈得一直亮著,要麼是紅燈要麼是綠燈

if e.is_set():# true,代表綠燈亮,那麼此時代表可以過車

time.sleep(5)# 所以在這讓燈等5秒鐘,這段時間讓車過

print('\033[31m 紅燈亮! \033[0m')# 綠燈亮了5秒後應該提示到紅燈亮

e.clear()# 把is_set設定為false

else:

time.sleep(5)# 此時代表紅燈亮了,此時應該紅燈亮5秒,在此等5秒

print('\033[32m 綠燈亮! \033[0m')# 紅的亮夠5秒後,該綠燈亮了

e.set()# 將is_set設定為true

def car(i,e):

e.wait()# 車等在紅綠燈,此時要看是紅燈還是綠燈,如果is_set為true就是綠燈,此時可以過車

print('第%s輛車過去了'%i)

if __name__ == '__main__':

e = event()

triff_light = process(target=tra,args=(e,))# 訊號燈的程序

triff_light.start()

for i in range(50):# 描述50輛車的程序

if i % 3 == 0:

time.sleep(2)

car = process(target=car,args=(i+1,e,))

car.start()

關於鎖 訊號量 及事件機制

鎖機制 l lock 一把鎖配一把鑰匙 拿鑰匙,鎖門 l.acquire 換鑰匙,開門l.release from multiprocessing import process,lock import time def check i with open 1 as f c f.read print ...

訊號量 事件 鎖 守護程序

什麼是程序?程序是計算機中最小的資源分配單位 程序與程序之間資料隔離,執行過程非同步 為什麼會出現程序的概念?合理利用cpu 提高使用者體驗 多個程序是可以同時利用多個cpu的,可以實現並行的效果 在主程序中控制子程序的方法?子程序物件 process target,args 在建立的這一刻根本就沒...

訊號量機制

1 訊號量的型別定義 訊號量 semaphore 的資料結構為乙個值和乙個 指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。一般來說,訊...