面试题答案
一键面试Event在两个线程间通信的基本原理
- 原理概述:
Event
是一种线程间通信的简单机制,它基于一个内部标志(布尔值)。线程可以等待这个标志变为True
,也可以设置这个标志为True
。- 当一个线程调用
event.wait()
时,如果内部标志为False
,该线程会阻塞,直到另一个线程调用event.set()
将内部标志设为True
,此时等待的线程将被唤醒继续执行。如果内部标志已经是True
,wait()
调用会立即返回。
- 应用场景:常用于实现线程同步,比如一个线程需要等待另一个线程完成某些任务(如数据处理、资源初始化等)后再继续执行。
使用Python的threading.Event实现简单线程同步场景示例
import threading
import time
def data_processor(event):
print("数据处理线程开始工作")
time.sleep(2) # 模拟数据处理耗时
print("数据处理完成")
event.set() # 设置事件标志,表示数据处理完成
def data_user(event):
print("数据使用线程等待数据处理完成")
event.wait() # 等待事件标志被设置
print("数据使用线程开始使用处理后的数据")
if __name__ == "__main__":
event = threading.Event()
processor_thread = threading.Thread(target=data_processor, args=(event,))
user_thread = threading.Thread(target=data_user, args=(event,))
processor_thread.start()
user_thread.start()
processor_thread.join()
user_thread.join()
在上述代码中:
data_processor
函数模拟数据处理线程,它先打印开始工作信息,然后通过time.sleep(2)
模拟2秒的数据处理时间,最后调用event.set()
表示数据处理完成。data_user
函数模拟使用数据的线程,它先打印等待信息,然后调用event.wait()
等待数据处理完成(即event
的内部标志变为True
),当event
被设置后,该线程继续执行并打印开始使用数据的信息。- 在
__main__
部分,创建了Event
对象和两个线程,分别启动并等待它们执行完毕。这样就实现了数据使用线程等待数据处理线程完成数据处理后再继续执行的线程同步场景。