1 Event对象的基本概述
用 multiprocessing.Event 实现线程间通信,使用multiprocessing.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中;主要用于主线程控制其他线程的执行,事件主要提供了三个方法:wait、clear、set。
事件处理的机制:
全局定义了一个Flag;
如果Flag值为False(clear:将Flag设置为False),则执行event.wait方法时阻塞;
如果Flag值为True(set:将Flag设置为True),则执行event.wait方法时不阻塞。
注:
event对象默认为False,即遇到event对象在等待就阻塞线程的执行。
2 信号操作的三种方法
2.1 设置信号
使用Event的set()方法可设置Event对象内部的信号标志为True。
Event对象提供了is_set()方法来判断其内部信号标志的状态,当使用Event对象的set()方法后,is_set()方法返回真。
2.2 清除信号
使用Event对象的clear()方法可清除Event对象内部的信号标志,即将其设置为False,is_set()方法返回假
2.3 等待
Event对象wait的方法只有在内部信号为真时才会很快执行并完成返回。当Event对象的内部信号标志为假时,则wait方法一直等待直到其为真时才返回。
3 示例
3.1 is_set() 查看对象是否被设置
from multiprocessing import Event # 创建事件对象 e = Event() # 查看对象是否被设置 print(e.is_set())
运行:False;说明为默认阻塞的。
因默认为False,此时运行wait时会被阻塞,例如
from multiprocessing import Event # 创建事件对象 e = Event() # 查看对象是否被设置 print(e.is_set()) e.wait() print('wait.........')
运行,打印出False之后,一直在阻塞中...
3.2 set()将默认设置为True
from multiprocessing import Event # 创建事件对象 e = Event() # 查看对象是否被设置 print(e.is_set()) #对事件进行设置,将Event事件设置为True e.set() e.wait() # set可以冲破阻塞,wait...可以打印出来 print('wait...')
运行
False
wait...
wait(time)中的time参数可以设置时间,当超过time时间后即可阻断阻塞。例如
from multiprocessing import Event # 创建事件对象 e = Event() # 查看对象是否被设置 print(e.is_set()) e.wait(3) print('wait...')
运行
False
wait...
备注:当超出阻塞时间3秒后,print('wait....')可以被打印出来
3.3 综合应用
from multiprocessing import Event,Process import time def wait_event(): print("wait for event setting") e.wait() print("wait for event 1:",e.is_set()) def wait_event_timeout(): print('wait for event setting or time out') e.wait(2) print("wait for event 2:",e.is_set()) e = Event() p1 = Process(name="block",target= wait_event) p1.start() p2 = Process(name="non-block",target= wait_event_timeout) p2.start() print("main: setting the event") time.sleep(3) e.set() print('event is set')
运行
main: setting the event wait for event setting or time out wait for event setting wait for event 2: False event is set wait for event 1: True
参考: