Even事件
Posted daviddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Even事件相关的知识,希望对你有一定的参考价值。
Even事件
1,定义
同进程的一样 ,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行
import time from threading import Thread, current_thread, Event event = Event() def check(): print(f'{current_thread().name}监测服务器是否开启') time.sleep(1) print(event.is_set()) event.set() print(event.is_set()) print('服务器已经开启') def connect(): print(f'{current_thread().name} 等待连接') event.wait() #event.wait(1) # 只阻塞1秒,1秒之后如果还没有进行set 直接进行下一步操作. print(f'{current_thread().name}连接成功') if __name__ == '__main__': t1 = Thread(target=check,) t2 = Thread(target=connect,) t1.start() t2.start() ####################################### Thread-1监测服务器是否开启 Thread-2 等待连接 False True 服务器已经开启 Thread-2连接成功
实例 from threading import Thread from threading import current_thread from threading import Event import time event = Event() def check(): print(f'{current_thread().name} 监测服务器是否开启...') time.sleep(4) event.set() print('服务器已经开启...') def connect(): count = 1 while not event.is_set(): if count == 4: print('连接次数过多,已断开') break event.wait(1) print(f'{current_thread().name} 尝试连接{count}次') count += 1 else: print(f'{current_thread().name} 连接成功...') t1 = Thread(target=check,) t2 = Thread(target=connect,) t1.start() t2.start() ################################ Thread-1 监测服务器是否开启... Thread-2 尝试连接1次 Thread-2 尝试连接2次 Thread-2 尝试连接3次 连接次数过多,已断开 服务器已经开启... ################################ 服务器睡3秒以下 Thread-1 监测服务器是否开启... Thread-2 尝试连接1次 Thread-2 尝试连接2次 服务器已经开启... Thread-2 尝试连接3次 Thread-2 连接成功...
以上是关于Even事件的主要内容,如果未能解决你的问题,请参考以下文章
弄懂浏览器Event Loop和node的Even Loop的区别
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段