python系列——多线程之event事件
发布日期:2021-09-30 09:33:38
浏览次数:6
分类:技术文章
本文共 1666 字,大约阅读时间需要 5 分钟。
参考博客:
(讲述了event和线程之间的关系)
(使用event实现红绿灯)
(使用event实现生产者消费者)
event与线程之间的关系:
同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。
event的方法:
is_set() 当且仅当内部标志为True
时返回True
。 set()
将内部标志设置为True
。所有等待它成为True
的线程都被唤醒。当标志保持在True
的状态时,线程调用wait()
是不会阻塞的。 clear()
将内部标志重置为False
。随后,调用wait()
的线程将阻塞,直到另一个线程调用set()
将内部标志重新设置为True
。 wait(timeout=None)
阻塞直到内部标志为真。如果内部标志在wait()
方法调用时为True
,则立即返回。否则,则阻塞,直到另一个线程调用set()
将标志设置为True
,或发生超时。 该方法总是返回True
,除非设置了timeout
并发生超时。 红绿灯实现:
#红绿灯'''标志位设定,代表绿灯,直接通行;标志位被清空,代表红灯;wait()等待变绿灯'''import threading,timeevent=threading.Event()def lighter(): '''0<5为绿灯,5 <10为红灯,count>10重置标志位''' event.set() # count=0 while True: if count>5 and count<10: event.clear() print("\033[1;41m red light is on \033[0m") elif count>10: event.set() count=0 else: print("\033[1;42m green light is on \033[0m") time.sleep(1) count+=1def car(name): '''红灯停,绿灯行''' while True: if event.is_set(): print("[%s] is running..."%name) time.sleep(0.25) else: print("[%s] sees red light,need to wait three seconds"%name) event.wait() print("\033[1;34;40m green light is on,[%s]start going \033[0m"%name)light=threading.Thread(target=lighter,)light.start()car1=threading.Thread(target=car,args=("Xiaoxiong",))car1.start()
转载地址:https://blog.csdn.net/h_jlwg6688/article/details/108374804 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月20日 15时13分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java.util.Stack类简介
2019-04-28
深入Java集合学习系列:LinkedHashSet的实现原理
2019-04-28
ConcurrentHashMap能完全替代HashTable吗?
2019-04-28
ConcurrentHashMap总结
2019-04-28
深入并发包-ConcurrentHashMap
2019-04-28
Java多线程(六)之Deque与LinkedBlockingDeque深入分析
2019-04-28
Java 并发工具包 java.util.concurrent 用户指南
2019-04-28
Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
2019-04-28
LinkedList 的实现原理浅析
2019-04-28
【集合框架】JDK1.8源码分析之HashMap(一)
2019-04-28
jdk1.8.0_45源码解读——ArrayList的实现
2019-04-28
小菜:Java异常处理的10个最佳实践
2019-04-28
java.nio.ByteBuffer用法小结
2019-04-28
深入理解ByteBuffer
2019-04-28
学习笔记之ByteBuffer使用和实现以及文件内存映射
2019-04-28
关于ByteBuffer使用解释
2019-04-28
ByteBuffer常用方法详解
2019-04-28
ByteBuffer的使用
2019-04-28
Java NIO系列教程(一) Java NIO 概述
2019-04-28
Java NIO系列教程(二) Channel
2019-04-28