锁Lock,信号量Semaphore,事件机制Event
锁
银行取钱 from multiprocessing import Process,Lock,Value import time def get_money(num): for i in range(100): num.value -= 1 time.sleep(0.01) def put_money(num): for i in range(100): num.value += 1 time.sleep(0.01) if __name__ == '__main__': num = Value("i",100) p_g = Process(target=get_money,args=(num,)) p_g.start() p_p = Process(target=put_money,args=(num,)) p_p.start() p_g.join() p_p.join() print(num.value) 加锁 from multiprocessing import Process,Lock,Value 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_g = Process(target=get_money,args=(num,l)) p_g.start() p_p = Process(target=put_money,args=(num,l)) p_p.start() p_g.join() p_p.join() print(num.value)
12306抢票 from multiprocessing import Process,Lock import time def check_ticket(i): with open("余票")as f: num = f.read() print("第%s个人查到剩余%s张票" % (i,num)) def buy_ticket(i,): with open("余票")as f: num = int(f.read()) time.sleep(0.1) if num > 0: print("\033[32m第%s个人买到了票\033[0m" % i) num -= 1 else: print("\033[35m第%s个人没有买到了票\033[0m" % i) time.sleep(0.1) with open("余票","w")as f: f.write(str(num)) if __name__ == '__main__': for i in range(10): p_c = Process(target=check_ticket,args=(i+1,)) p_c.start() for i in range(10): p_b = Process(target=buy_ticket,args=(i+1,)) p_b.start() 加锁 from multiprocessing import Process,Lock import time def check_ticket(i): with open("余票")as f: num = f.read() print("第%s个人查到剩余%s张票" % (i,num)) def buy_ticket(i,l): l.acquire() with open("余票")as f: num = int(f.read()) time.sleep(0.1) if num > 0: print("\033[32m第%s个人买到了票\033[0m" % i) num -= 1 else: print("\033[35m第%s个人没有买到了票\033[0m" % i) time.sleep(0.1) with open("余票","w")as f: f.write(str(num)) l.release() if __name__ == '__main__': l = Lock() for i in range(10): p_c = Process(target=check_ticket,args=(i+1,)) p_c.start() for i in range(10): p_b = Process(target=buy_ticket,args=(i+1,l)) p_b.start()
信号量
from multiprocessing import Semaphore,Lock l = Semaphore(3) l.acquire() #拿走钥匙,锁门 print(123) l.acquire() print(456) l.release() #还回钥匙,供其他人开门 print(654) l.acquire() print(789) l.release() print(321)
排队上大号 from multiprocessing import Process,Semaphore import time import random def func(i,s): s.acquire() print("\033[31m 第%s个人进卫生间 \033[0m" % i) time.sleep(random.randint(2,5)) print("\033[32m 第%s个人出卫生间 \033[0m" % i) s.release() if __name__ == '__main__': s = Semaphore(5)#初始化卫生间可以供5个人同时使用 for i in range(20): p = Process(target=func,args=(i+1,s)) p.start()
事件机制
from multiprocessing import Event e = Event() e.is_set() print(e.is_set()) e.wait() print(123) 结果:False from multiprocessing import Event e = Event() e.is_set() print(e.is_set()) e.set() e.wait() print(e.is_set()) print(123) 结果: False True 123 from multiprocessing import Event e = Event() e.is_set() print(e.is_set()) e.set() e.wait() print(e.is_set()) print(123) e.clear() print(e.is_set()) e.wait() print(123) 结果: False True 123 False 总结: 事件是通过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 light(e): '''红绿灯函数''' while 1: #红绿灯循环亮 if e.is_set(): #True 绿灯亮着,可以通车 time.sleep(5) #绿灯亮灯时间为5秒 print("\033[31m 红灯亮! \033[0m") #5秒后,红灯亮 e.clear() #将is_sent设置为False, else: time.sleep(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() l = Process(target=light,args=(e,)) l.start() for i in range(50): if i %3 ==0: time.sleep(2) c = Process(target=car,args=(i+1,e)) c.start()