什么是事件?

事件在内部管理了一个标志Flag,如果Flag值为 False,那么线程在执行event.wait方法时就会阻塞等值直到Flag值为True,该线程便会顺利执行,而Flag的值是通过event.set()和event.clear()设定的:

  • set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
  • clear(): 将标志设为False。
  • wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
  • isSet(): 获取内置标志状态,返回True或False。

而Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态,所以当个多个线程处于wait状态时,一旦标志位Flag变为真时,这些线程便会 “同时” (GIL锁的原因,假装在同时执行)执行。

简单的生产者-消费者模型

通过事件,我们也可以实现一个简单的生产者-消费者模型:

import threadingimport randomimport time# 假定商品序号goods = 0# 定义一个事件event = threading.Event()def consumer(): time.sleep(0.5) print(threading.currentThread().getName() + ' consumer is wait for goods.') # 等待事件,进入阻塞状态 event.wait() print(threading.currentThread().getName() + ' consumer gets the goods: {}'.format(goods))def producer(): global goods time.sleep(1) goods = random.randint(1, 11) print('producer makes the goods: {}'.format(goods)) time.sleep(1) # Flag --> True event.set()if __name__ == "__main__": thread_consumer1 = threading.Thread(target=consumer)  thread_consumer2 = threading.Thread(target=consumer)  thread_producer = threading.Thread(target=producer)  thread_consumer1.start() thread_consumer2.start() thread_producer.start() thread_consumer1.join() thread_consumer2.join() thread_producer.join() print('consumer-producer example end.')

运行截图如下:

运行结果

我们可以看到,两个消费者都在阻塞等待商品的生产,而一旦生产者通知商品生产成功(event.set() --> Flag=True),消费者们便都会得到该商品,这样看来,event 看似就是condition的简化版本,只是没了锁,线程们不能同步阻塞对共享资源的访问。

以下会使线程进入到阻塞状态的是_Python并行编程(五):多线程同步之event(事件)...相关推荐

  1. python多线程并行编程_Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  2. educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步

    什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制.前面我们谈到一个进程内的多个线程的某些资源是共享的,这也是线程的一大优势,但是也随之带来一个问题,即当两个及两个以上的线程同时访问共享 ...

  3. java线程条件变量_多线程同步条件变量(转载)

    最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...

  4. java runnable wait_面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  5. new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

  6. 既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

  7. 多线程-使线程具有有序性

    使线程具有有序性: 线程在运行时多个线程之间执行的时机是无序的,下面通过改造代码实现运行具有有序性: 1 /** 2 * 线程类 3 */ 4 public class MyThread extend ...

  8. java 阻塞 wait_Java面试基础问题之(二十一)—— 线程持有的任何对象.wait()都会使线程陷入阻塞吗...

    直接上代码: 结果: 抛出了一个异常:IllegalMonitorStateException 去官方文档查看IllegalMonitorStateException类(是个Exception的子类) ...

  9. 线程类中如何调用service_你真的了解Java多线程吗?

    一.程序.进程和线程.单核CPU和多核CPU.并行与并发 什么是程序? 程序是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码. 什么是进程? 进程是指程序的一次执行过程,或是正在运 ...

最新文章

  1. Android笔记(adb命令--reboot loader)
  2. Ubuntu 升级npm 以及安装cross-env 过程中遇到的问题
  3. 用scikit-learn学习K-Means聚类
  4. Notification之 - Android5.0实现原理(二)
  5. P3302 SDOI2013森林
  6. 压缩命令_Linux gzip命令:压缩文件或目录
  7. c语言中格式化字符串系列函数包括,解析C语言中常用的格式化输入、输出函数...
  8. spring 依赖注入_Spring从入门到入土——依赖注入(DI)
  9. 【王道考研计算机网络】—计算机网络的概念 组成 功能 分类
  10. 如果没有云栖大会,中国云计算将要落后多少年?
  11. Libhybris之Glibc和Bionic共存时的TLS问题(四)
  12. 六石管理学:行政人员也要学会使用SVN保存文档
  13. UNIX 环境高级编程
  14. IOS企业应用出现无法验证,需要网络连接以在这台iPad上验证。接入互联网并重试
  15. 安装Charles证书失败(夜神模拟器总是弹出此网站安全证书有问题),对安卓手机网络进行抓包
  16. Qt--样式表设置按钮样式
  17. 实时网速怎么看快慢_如何知道网络的实时网速?4种方法轻松查询
  18. EtherCAT运动控制卡小线段前瞻的连续插补运动
  19. Qt使用三点坐标画圆弧
  20. C++ 播放声音 (学习笔记)

热门文章

  1. Python中判断两个字符串的内容是否相同
  2. Python——相对路径的学习笔记
  3. 【最详细】Tcpdump使用实验
  4. 需要大量设计的软件如何进行敏捷开发
  5. [POJ 2891] Strange Way to Express Integers
  6. 读书笔记-你不知道的JS上-词法作用域
  7. 济南学习 Day 5 T2 am
  8. Runner站立会议06
  9. Java基础知识强化之集合框架笔记50:Map集合之Map集合的概述和特点
  10. C#中面向连接的客户端与服务端编程