鎖
from multiprocessing import lockl = 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,lockl = 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 evente = 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操作來改變。一般來說,訊...