以下会使线程进入到阻塞状态的是_Python并行编程(五):多线程同步之event(事件)...
什么是事件?
事件在内部管理了一个标志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(事件)...相关推荐
- python多线程并行编程_Python并行编程(二):基于线程的并行
1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...
- educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步
什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制.前面我们谈到一个进程内的多个线程的某些资源是共享的,这也是线程的一大优势,但是也随之带来一个问题,即当两个及两个以上的线程同时访问共享 ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- java runnable wait_面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...
- 既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...
- 多线程-使线程具有有序性
使线程具有有序性: 线程在运行时多个线程之间执行的时机是无序的,下面通过改造代码实现运行具有有序性: 1 /** 2 * 线程类 3 */ 4 public class MyThread extend ...
- java 阻塞 wait_Java面试基础问题之(二十一)—— 线程持有的任何对象.wait()都会使线程陷入阻塞吗...
直接上代码: 结果: 抛出了一个异常:IllegalMonitorStateException 去官方文档查看IllegalMonitorStateException类(是个Exception的子类) ...
- 线程类中如何调用service_你真的了解Java多线程吗?
一.程序.进程和线程.单核CPU和多核CPU.并行与并发 什么是程序? 程序是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码. 什么是进程? 进程是指程序的一次执行过程,或是正在运 ...
最新文章
- Android笔记(adb命令--reboot loader)
- Ubuntu 升级npm 以及安装cross-env 过程中遇到的问题
- 用scikit-learn学习K-Means聚类
- Notification之 - Android5.0实现原理(二)
- P3302 SDOI2013森林
- 压缩命令_Linux gzip命令:压缩文件或目录
- c语言中格式化字符串系列函数包括,解析C语言中常用的格式化输入、输出函数...
- spring 依赖注入_Spring从入门到入土——依赖注入(DI)
- 【王道考研计算机网络】—计算机网络的概念 组成 功能 分类
- 如果没有云栖大会,中国云计算将要落后多少年?
- Libhybris之Glibc和Bionic共存时的TLS问题(四)
- 六石管理学:行政人员也要学会使用SVN保存文档
- UNIX 环境高级编程
- IOS企业应用出现无法验证,需要网络连接以在这台iPad上验证。接入互联网并重试
- 安装Charles证书失败(夜神模拟器总是弹出此网站安全证书有问题),对安卓手机网络进行抓包
- Qt--样式表设置按钮样式
- 实时网速怎么看快慢_如何知道网络的实时网速?4种方法轻松查询
- EtherCAT运动控制卡小线段前瞻的连续插补运动
- Qt使用三点坐标画圆弧
- C++ 播放声音 (学习笔记)