事件:通过一个信号来控制多个进程同时执行或者阻塞。
一个信号可以使所有的进程都进入到阻塞状态,也可以控制所有的进程接触阻塞,一个时间被创建之后,默认是阻塞的状态
from multiprocessing import Event
e = Event() #创建一个事件
print(e.is_set()) #查看状态,默认是阻塞状态
print(123456)
e.wait() #依据e.is_set()的指来决定是否阻塞
print(123456) #这个不会被打印,因为阻塞
输出:
from multiprocessing import Event
e = Event()
print(e.is_set()) #查看状态,默认是阻塞状态
print(123456)
e.set() #将这个事件状态改为True
print(e.is_set())
e.wait() #依据e.is_set()的指来决定是否阻塞
print(123456)
输出:
from multiprocessing import Event
e = Event()
print(e.is_set()) #查看一个时间的状态,默认是阻塞状态
print(123456)
e.set() #将这个事件状态改为True
print(e.is_set())
e.wait() #依据e.is_set()的指来决定是否阻塞
print(123456) #这个不会被打印,因为阻塞
e.clear() #将事件状态改为False
print(e.is_set())
e.wait()
print('*'*10)
输出:
set
和clear
分别用来修改一个事件的状态,True
或者False
is_set
用来查看事件的状态
wait
依据事件的状态来决定自己是否阻塞 False
阻塞,True
非阻塞
红绿灯事件
import random, time
from multiprocessing import Process, Event
def cars(e, i):
# pass
if not e.is_set():
print('car%d在等待' % i)
e.wait() # 阻塞,直到一个事件状态变为True
print('\033[32mcar%d通过\033[0m' % i)
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)
if __name__ == '__main__':
e = Event()
traffic = Process(target=light, args=(e,))
traffic.start()
# print(e.is_set())
for i in range(20):
# print(e.is_set())
car = Process(target=cars, args=(e, i)) # 此时e的状态位True
car.start()
time.sleep(random.random())