關於鎖 訊號量 及事件機制

2022-02-25 17:34:50 字數 2839 閱讀 1459

鎖機制:

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('%s查到還剩%s張余票'%(i,c))

def buy(i,l):

l.acquire()

with open('1')as f:

c = int(f.read())

time.sleep(0.1)

if c>0:

print('\033[31m %s買到了一張票\033[0m'%i)

time.sleep(0.1)

c-=1

else:

print('\033[32m 尊敬的%s,餘票已不足,請查詢其他車次 \033[0m'%i)

with open('1','w')as f:

f.write(str(c))

time.sleep(0.1)

l.release()

if __name__ == '__main__':

l=lock()

lst_name=['張三','李文達','達文西','alex','wisir','coco','jack','tony']

lis=

liss=

for i in lst_name:

p=process(target=check,args=(i,))

p.start()

for i in lst_name:

p1=process(target=buy,args=(i,l))

p1.start()

[ss.join() for ss in lis]

[ss.join() for ss in liss]

訊號機制:

sem=semaphore(n)

n:是指初始化一把鎖配幾把鑰匙,乙個int型

拿鑰匙,鎖門  sem.acquire()

還鑰匙,開門 sem.release()

訊號量機制比鎖機制多了乙個計數器,這個計數器是用來記錄當前剩餘幾把鑰匙的

當計數器為0時,表示沒有鑰匙了,此時的acquire()處於阻塞

對於計數器來說,每acquire一次,計數器內部就減一,release一次,計數器就加一

from   multiprocessing import process,semaphore

import time

import random

def spa(sam,i):

sam.acquire()

print('第%s顧客進去了'%(i+1))

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

print('第%s顧客出來了' % (i + 1))

sam.release()

if __name__ == '__main__':

sam=semaphore(5)

for i in range(20):

p=process(target=spa,args=(sam,i))

p.start()

事件機制

e=event()

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

e.clear() # 將is_set()設為false

e.wait()#判斷is_set的bool值,如果bool為true,則非阻塞,bool值為false,則阻塞

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

from multiprocessing import process,event

import time

def traffic(e):

e.set()

while 1:

if e.is_set():

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

time.sleep(5)

# print('\033[31m 紅燈亮 \033[0m ')

e.clear()

else:

print('\033[31m 紅燈亮 \033[0m ')

time.sleep(5)

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

e.set()

def car(i,e):

e.wait()

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

time.sleep(1)

if __name__ == '__main__':

e=event()

t=process(target=traffic,args=(e,))

t.start()

for i in range(40):

print(i)

c=process(target=car,args=(i,e))

c.start()

c.join()

t.terminate()

鎖,訊號量,事件機制

鎖 from multiprocessing import lock l lock l.acquire 拿走鑰匙,鎖門,不讓其他人進屋 l.release 釋放鎖。還鑰匙,開門,允許其他人進屋 執行乙個程序的時候不允許其他程序一起執行 舉例 兩個人在銀行共同存錢取錢 from multiproces...

訊號量 事件 鎖 守護程序

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

訊號量機制

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