您的位置:首页 > 编程语言 > Python开发

python学习笔记——创建事件对象Event

2018-04-02 23:50 387 查看

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


参考:

Python编程之event对象的用法实例分析

python基础之Event对象、队列和多进程基础

Python线程event
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: