python线程的同步事件Event
Event对象:
用于线程间的通信,某个线程需要根据其他线程的状态来判断自己的下一步操作。
Event内部定义了一个全局变量:_flag,默认为False。 当_flag = False时,会阻塞当前线程的执行;_flag = True时,当前线程会继续执行。
Event内部还定义了如下方法来操纵标志位:
- set() ——将_flag(标志位)设置为True;
- clear()——将_flag设置为False;
- is_set()——返回当前_flag的状态。等同于isSet()。
- wait()——阻塞当前线程的执行,直到_flag被设置为True。只有当_flag = False时,调用wait()才会阻塞当前线程的运行,此时wait()方法相当于pass(什么也不做)。
示例1:主线程控制子线程的执行。
import threading, time event = threading.Event() def foo():
print("wait server... at ", time.ctime()) # 开启子线程t时打印这句话
event.wait() # 阻塞子线程的执行,此时event中的标志位为False
print("connect to server... at ", time.ctime()) t = threading.Thread(target=foo,args=()) t.start() # 开启一个子线程
time.sleep(3) # 主线程休眠3秒
print("start server successfully... at ", time.ctime()) # 在foo函数中的event.wait()后打印这句话,此时子线程被阻塞
time.sleep(3) # 主线程继续休眠3秒
event.set() # 将event中的标志位设置为True,foo函数中的最后一句话就被打印了。
print(event.is_set())
打印结果如下:
wait server... at Sun Mar 24 11:25:51 2019
start server successfully... at Sun Mar 24 11:25:54 2019
connect to server... at Sun Mar 24 11:25:57 2019
整个程序的流程如下所示:

示例2:子线程之间传递evnet
import threading, time
class Boss(threading.Thread):
def run(self):
print("BOSS: 今晚加班到22:00")
print(event.is_set()) # _flag = False
event.set() # 将_flag设置为True,Worker线程往下执行
time.sleep(5)
print("BOSS: 22:00了,可以下班了 at ", time.ctime())
print(event.is_set())
event.set() # 宣布下班后,将_flag设置为True,Worker线程继续执行
class Worker(threading.Thread):
def run(self):
event.wait() # 此时Worker线程被阻塞,等待Boss线程先运行
print("Worker: 命苦啊。。。at ", time.ctime())
time.sleep(1)
event.clear() # 将_flag设置为False
event.wait() # 阻塞Worker线程运行,等待老板下班命令
print("Worker: oh yeah!")
if __name__ == '__main__':
event = threading.Event()
threads = []
for i in range(5):
threads.append(Worker())
threads.append(Boss())
for t in threads:
t.start()
# 阻塞主线程,让子线程先执行完毕
for t in threads:
t.join()
打印结果如下所示:
BOSS: 今晚加班到22:00
False
Worker: 命苦啊。。。at Sun Mar 24 16:56:53 2019
Worker: 命苦啊。。。at Sun Mar 24 16:56:53 2019
Worker: 命苦啊。。。at Sun Mar 24 16:56:53 2019
Worker: 命苦啊。。。at Sun Mar 24 16:56:53 2019
Worker: 命苦啊。。。at Sun Mar 24 16:56:53 2019
BOSS: 22:00了,可以下班了 at Sun Mar 24 16:56:58 2019
False
Worker: oh yeah!
Worker: oh yeah!
Worker: oh yeah!
Worker: oh yeah!
Worker: oh yeah! ***Repl Closed***
线程的执行过程与event传递如图所示:

由此看见,Event对象作为一个标志位,让一个线程便于控制另一个或另一些线程的执行,而控制方式就是修改标志位的布尔值。
代码参考:
https://www.cnblogs.com/lidagen/p/7252247.html
http://www.cnblogs.com/yuanchenqi/articles/6248025.html
python线程的同步事件Event的更多相关文章
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 多线程面试题系列(6):经典线程同步 事件Event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...
- 转--- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- 秒杀多线程第六篇 经典线程同步 事件Event
原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
- 《Windows内核编程》---系统线程和同步事件
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...
- Windows驱动开发之线程与同步事件
转载请注明来源: enjoy5512的博客 : http://blog.csdn.net/enjoy5512 GitHub : https://github.com/whu-enjoy .1. 使用系 ...
随机推荐
- Jacobian矩阵、Hessian矩阵和Newton's method
在寻找极大极小值的过程中,有一个经典的算法叫做Newton's method,在学习Newton's method的过程中,会引入两个矩阵,使得理解的难度增大,下面就对这个问题进行描述. 1, Jac ...
- python安装与pip操作
python安装 1, 下载并解压Python-3.6.2.tar.xz 2,tar xvJf Python-3.6.2.tar.xz 2./configure --prefix=/usr/local ...
- 有关Linux ipv6模块加载失败的问题
有关Linux ipv6模块加载失败的问题 同事一个SUSE11sp3环境配置ipv6地址失败,提示不支持IPv6,请求帮助,第一反应是应该ipv6相关内核模块没有加载. 主要检查内容: ...
- el-input的color修改无效问题
相信很多前端初学者跟我一样也遇到过el-input的color修改无效问题 如下图:我想把el-input里面的文字改成蓝色,但是使用总是失败 修改方法:打开调试界面,找到el-input对应的sty ...
- keepalived添加服务自启动报错分析
安装完keepalived后设置为服务自启动 将路径为/usr/local/src/keepalived-1.3.4/keepalived/etc/init.d的文件keepalived拷贝到/etc ...
- Java基础(命令行操作、注释及API、)
一.常用的dos命令. dir:列出当前目录下的文件及文件夹 md:创建目录 rd:删除目录 cd:进入到指定目录 cd..:退出到上一级目录 cd\:退出到根目录 del:删除文件 exit:退出d ...
- Ubuntu iso下载地址(14、16、18)
Ubuntu镜像,快速下载 ubuntu 14.04: http://mirrors.aliyun.com/ubuntu-releases/14.04/ubuntu 16.04: http://mir ...
- pandas的一些
在具体谈及骚操作之前先捋一遍基本的统计特征函数 方法名 函数功能 所属库 sum() 计算数据样本的综合(按照列计算) pandas mean() 计算数据样本的算术平均数 pandas var() ...
- project2
[概念] 要好好理解并且背下来记住 Java基础,呵呵呵.自己查吧. local host搞错了,整个跑不出来.真尴尬.不理解啊. static原来是全局的意思啊,好吧.以前都忘了,这次该记住了.st ...
- 关于Mybatis浅谈
1. 历史 MyBatis本是apache的一个开源项目iBatis. 2010年这个项目由apache software foundation 迁移到了google code,并且取名为MyBati ...