Python并发编程-事件,红绿灯控制

时间:2023-03-10 01:17:29
Python并发编程-事件,红绿灯控制

事件用来控制多个进程同时执行或者阻塞

  • set和clear
    • 分别用来修改一个事件的状态,True或者False
  • is_set 用来查看一个事件的状态
  • wait 是依据事件的状态来决定自己是否在wait处阻塞
    • False阻塞, True不阻塞
from multiprocessing import Event
#一个信号可以使得所有的进程都进入阻塞状态
#也可以控制所有的进程解除阻塞
#一个事件被创建之后, 默认是阻塞状态
e = Event() #创建了一个事件
print(e.is_set()) #查看一个事件的状态,默认被设置成阻塞
print(12345)
e.set() #将这个事件的状态改为True,即不阻塞
e.wait() #依据e.is_set()的值来决定是否阻塞
print(12345)
e.clear() #将这个事件的状态改为False
print(e.is_set())
e.set()
e.wait() #有条件的等待,等待这个事件的信号变成True
print('*'* 10)
print(e.is_set())
e.clear() #将这个事件的状态改为False,但是并没有wait()将其阻塞,故下面的代码还是可以打印
print('*'* 10)

红绿灯事件

from multiprocessing import Event, Process
import time
import random
def light(e):
while True:
if e.is_set():
e.clear()
print('\033[31m红灯亮了\033[0m')
else:
e.set()
print('\033[32m绿灯亮了\033[0m')
time.sleep(2) def cars(e,i):
if not e.is_set(): #表示'红灯亮了:':
print('car%i在等待'%i)
e.wait() #'等红灯'阻塞直到得到一个事件状态变为True的信号
#'车通行'
print('\033[0;32;40mcar%i通过\033[0m'%i) if __name__ == '__main__':
e = Event()
traffic = Process(target=light,args=(e,))
traffic.start()
for i in range(20): car = Process(target=cars, args=(e,i))
car.start()
time.sleep((random.random()))