(6)进程---Event事件

时间:2023-03-09 05:56:15
(6)进程---Event事件

# 阻塞事件 :

e = Event()生成事件对象e

e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False]

e.wait(2) 传参,相当于time.sleep(2)

# 如果是True 那就不加阻塞

# 如果是False 就加阻塞

# 控制这个属性的值

# set()方法 将这个属性的值改成True

# clear()方法 将这个属性的值改成False

# is_set()方法 判断当前的属性是否为True (默认上来是False)

例:模拟红绿灯,假设有20辆小车全部通过后,红绿灯终止;

from multiprocessing import Process, Event
import time, random
def traffic_light(e):
# traffic_light 只做一件事就是红灯和绿灯的变色效果
print("红灯亮")
while True:
# 默认is_set 获取到的值是False
if e.is_set():
# 红灯区间
time.sleep(1)
print("红灯亮")
e.clear() # False
else:
# 绿灯区间
time.sleep(1)
print("绿灯亮")
e.set() # True def car(e, i):
# e.is_set() 为False时成立
if not e.is_set():
print("car %s 在等待" % (i))
e.wait()
print("car %s 通过了" % i) if __name__ == "__main__":
e = Event()
lst = []
p = Process(target=traffic_light, args=(e,))
p.daemon = True
p.start() for i in range(20):
time.sleep(random.randrange(0, 2))
p = Process(target=car, args=(e, i))
p.start()
lst.append(p)
for p in lst:
p.join() print("程序彻底跑完~")

执行结果: 如果想车辆跑完了,红绿灯继续运行,去掉守护进程和末尾的阻塞就可以了

红灯亮
绿灯亮
car 0 通过了
car 1 通过了
红灯亮
car 3 在等待
car 2 在等待
car 4 在等待
car 5 在等待
car 6 在等待
绿灯亮
car 4 通过了
car 3 通过了
car 2 通过了
car 5 通过了
car 6 通过了
car 7 通过了
car 9 通过了
car 8 通过了
car 10 通过了
红灯亮
car 11 在等待
绿灯亮
car 11 通过了
car 13 通过了
car 12 通过了
car 14 通过了
红灯亮
car 15 在等待
绿灯亮
car 15 通过了
car 17 通过了
car 16 通过了
car 18 通过了
红灯亮
car 19 在等待
绿灯亮
car 19 通过了
程序彻底跑完~ Process finished with exit code 0