关于锁、信号量、及事件机制
锁机制:
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() lis.append(p) for i in lst_name: p1=Process(target=buy,args=(i,l)) p1.start() liss.append(p1) [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()