事件Event是用于堵塞进程执行的一个用途,可以让进程之间做到同时堵塞同时进行,类似于一种断点的效果,常用于一种信号状态的传递
Event类的基础用法
e = Event() #创建一个event对象
e.is_set() #展示当前event的状态,一个对象刚被创建是,状态都为False即阻塞状态
e.wait() #wait方法会根据当前的对象状态来控制程序是否阻塞
e.set() #将当前的事件状态改为True
e.clear() #将当前的事件状态改为False
下面我们展示一个简单的例子,因为一开始默认创建的事件,为false状态,因此我们先用set将状态改为Ture,这样654321字符串被打印了出来,随后使用clear将状态重新改为False之后,就被堵塞了,因此“123456”无法被打印出来了
from multiprocessing import Event
e = Event()
print(e.is_set())
e.set()
e.wait()
print(654321)
e.clear()
e.wait()
print(123456)
----------------------
False
654321
红绿灯模型
下面这个例子展示的就是event堵塞的效果,当绿灯亮的时候,就会使得cars方法向下执行,而当红灯亮的时候就会堵塞程序的执行
from multiprocessing import Process,Event
import random
from time import sleep
def lights(e):
while True:
e.clear()
print("红灯亮,禁止通行")
sleep(8)
e.set()
print("绿灯亮,冲冲冲")
sleep(8)
def cars(i,e):
if e.is_set:
print("car%i在等待"%i)
e.wait()
e.wait()
print("car%i通过了"%i)
if __name__ == '__main__':
e = Event()
p = Process(target=lights,args=(e,))
p.start()
car = Process(target=cars,args=(i,e))
car.start()