7.python多进程事件-红绿灯
2018-12-27 本文已影响4人
花间派I风月
一、 概述
多进程中的事件Event-进程之间的状态标记通信,它是由进程设置的信号标志,如果信号标志为真,则其他进程等待直到信号接触。
Event对象实现了简单的进程通信机制,它提供了设置信号,清除信号,等待等用于实现进程间通信的方法。
Event对象创建时默认信号设置为False。False时会在wait()处阻塞,True时不阻塞。
二、 常用方法与属性
- event.set()
- 设置信号
- 使用Event的set方法可以设置Event对象内部信号标志为True.
- event.clear()
- 清除信号
- 可以清除Event对象内部的信号标志,将其设为False。
- event.warit()
- 等待
- wait方法只有在信号为True的时候才会执行并完成返回。当内部信号为False时,则在wait方法处阻塞一直到信号标志变为True时才继续执行。一个进程中可以设置多个wait方法。有多个wait方法并不代表进程会阻塞,而只有在信号为False时才阻塞在wait方法处。当信号变为Ture时会进继续执行。
- event.is_set()
- 返回当前信号标志状态(True/False)
三、示例
- 基本示例
from multiprocessing import Event
if __name__ == '__main__':
e = Event()
print(e.is_set()) #False
# e.wait() <-会阻塞在此处
e.clear() #clear在wait后面,并不能生效。
print('wait1')
e.set()
print(e.is_set()) #True
e.clear()
e.wait() #不会阻塞
print('wait2')
- 红绿灯
import random
import time
from multiprocessing import Process, Event
def cars(event, i ):
if not event.is_set():
print('cat: %s 等待红灯' %i)
event.wait() #阻塞直到事件状态变为 True的信号
else:
print('\033[0;32;40mcar%i通过\033[0m'%i)
def light(event):
while True:
if event.is_set():
event.clear()
print('\033[31m红灯亮了\033[0m')
else:
event.set()
print('\033[32m绿灯亮了\033[0m')
time.sleep(2)
if __name__ == '__main__':
event = Event()
p = Process(target=light, args=(event,))
p.start()
for i in range(20):
car = Process(target= cars, args=(event, i ))
car.start()
time.sleep(random.random())