1 Event对象的基本概述
用 multiprocessing.Event 实现线程间通讯,使用multiprocessing.Event能够使一个线程等待其余线程的通知,咱们把这个Event传递到线程对象中;主要用于主线程控制其余线程的执行,事件主要提供了三个方法:wait、clear、set。html
事件处理的机制:python
全局定义了一个Flag;编程
若是Flag值为False(clear:将Flag设置为False),则执行event.wait方法时阻塞;url
若是Flag值为True(set:将Flag设置为True),则执行event.wait方法时不阻塞。spa
注:.net
event对象默认为False,即遇到event对象在等待就阻塞线程的执行。线程
2 信号操做的三种方法
2.1 设置信号
使用Event的set()方法可设置Event对象内部的信号标志为True。code
Event对象提供了is_set()方法来判断其内部信号标志的状态,当使用Event对象的set()方法后,is_set()方法返回真。htm
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
参考: