前言
锁:Lock,多个进程中同一时间,只能排序执行程序。(一把钥匙只能进入一个,归还钥匙后面的拿钥匙进入一个,类推)
信号:Semaphore,多个进程中同一时间,同时被N个进程执行。
事件:Event,通过一个信号控制多个进程,同时执行或阻塞。
一、进程锁
1、进程锁,比如抢票会有多个用户一起抢。
没有锁进程的情况下:发现余票只有一张,但每个进程都能抢到票了,实际也就只有一张改怎么办?
2、运用进程锁:Lock
这样就可以解决类似这样的问题。
from multiprocessing import Process,Lock import time,json def find(): with open(r'test.py')as f: d = json.load(f) print('剩余免费门票:%s'%d['count']) def buy(i,lock): lock.acquire() # 拿钥匙 with open(r'test.py')as f: d = json.load(f) if d['count']<=0:print('门票已被抢完~') else: print('恭喜用户 %s 成功抢到门票了'%i) if d['count']!=0:d['count']-=1 time.sleep(0.2) with open(r'test.py','w')as f: json.dump(d,f) lock.release() # 还钥匙 if __name__ == '__main__': for i in range(1): # 5个进程同时查询 p=Process(target=find) p.start() lock=Lock() for i in range(5): p1=Process(target=buy,args=(i,lock)) p1.start()
二、信号
1、信号量-Semaphore:比如一个程序最多2个进入。
基本原理类似锁中的执行,锁是单个进入,在锁的基础上使用了一个内置的计数器,从而达到多个同时进入。
可以任意设置同时最多进入多少个。
# 1、信号量-Semaphore:比如一个程序最多2个进入 from multiprocessing import Process,Semaphore import time def func(i,sem): sem.acquire() print('用户 %s 进入了'%i) time.sleep(5) print('用户 %s 退出了'%i) sem.release() if __name__ == '__main__': sem=Semaphore(2) # 设置能执行N个同时执行 for i in range(1,5): p=Process(target=func,args=(i,sem)) p.start(
三、事件
- 一个信号可以是所有的进程都进入阻塞状态
- 也可以控制所有的进程解除阻塞,创建时默认为阻塞状态
1、Event:通过一个信号控制多个进程,同时执行或阻塞。
from multiprocessing import Event e=Event() e.is_set() # 创建一个事件,默认为阻塞状态:False print('阻塞前~') # e.set() # 将事件堵塞状态设为:True e.wait() # 如果is_set()的值为False,那么进行堵塞,否则不堵塞 e.clear() # 将事件的堵塞状态清空,即为默认状态:False print('阻塞后~~~')
将事件堵塞状态设为:True
将事件堵塞状态设为:False
2、事件实例:红绿灯事件
from multiprocessing import Process,Event import time def func(e): while 1: if e.is_set(): e.clear() print('红灯停~~') else: e.set() print('绿灯亮起~') time.sleep(3) def car(i,e): if not e.is_set(): print('%s 等红灯中==' % i) e.wait() print('%s 通行中-->' % i) if __name__ == '__main__': e=Event() p=Process(target=func,args=(e,)) p.start() for i in range(1,11): p1=Process(target=car,args=(i,e)) p1.start() time.sleep(0.5)
欢迎来大家QQ交流群一起学习:482713805