说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 的 threading 模块中,Event(事件对象)是一种用于线程间通信的简单机制。Python threading 模块中的 Event 对象是一种简单的线程同步机制,用于在线程之间传递信号。它可以被视为一个简单的开关,可以被设置(开)或清除(关)。
threading.Event 是一个用于线程同步的简单机制。它提供了一种线程间的通信方式,通过一个内部标志来管理线程的执行状态。事件对象可以用来控制某个条件的发生,使得多个线程可以等待该条件的满足。
Event 内部维护了一个标志位,初始时通常为 False 。线程可以通过 wait 方法等待事件的发生(即标志位被设置为 True)。其他线程可以通过 set 方法将标志位设置为 True ,以通知等待的线程;通过 clear 方法将标志位重置为 False 。
构造方法:
event = threading.Event()
常用方法:
set()
: 设置内部标志为 True,并唤醒所有等待的线程。clear()
: 将内部标志重置为 False。wait(timeout=None)
: 阻塞线程直到内部标志为 True 或超时。返回 True 表示标志为 True,返回 False 表示超时。is_set()
: 判断内部标志是否为 True。简单示例:
import threading
import time
# 创建一个事件对象
event = threading.Event()
def worker():
print("线程等待事件...")
event.wait() # 等待事件设置
print("事件已设置,线程继续执行")
def setter():
time.sleep(2)
print("设置事件...")
event.set() # 设置事件
thread1 = threading.Thread(target=worker)
thread2 = threading.Thread(target=setter)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
另外:
import threading
import time
# 创建一个事件对象
event = threading.Event()
def initializer():
print("初始化操作...")
time.sleep(3) # 模拟初始化操作
print("初始化完成,设置事件")
event.set() # 设置事件,通知其他线程
def dependent_task(n):
print(f"线程 {n} 等待初始化完成...")
event.wait() # 等待事件
print(f"线程 {n} 开始执行任务")
# 创建并启动初始化线程
init_thread = threading.Thread(target=initializer)
init_thread.start()
# 创建并启动依赖线程
threads = []
for i in range(5):
t = threading.Thread(target=dependent_task, args=(i,))
threads.append(t)
t.start()
init_thread.join()
for t in threads:
t.join()
再有:
import threading
import time
event = threading.Event()
def worker():
print("工人等待开始信号")
event.wait()
print("工人开始工作")
thread = threading.Thread(target=worker)
thread.start()
time.sleep(3)
event.set() # 发送开始信号
thread.join()
假设我们有一个数据处理程序,一个线程负责生成数据,另一个线程负责处理数据。当数据生成完成后,通过事件通知处理线程开始工作。
import threading
import time
import random
event = threading.Event()
data = []
def data_generator():
global data
print("数据生成器开始生成数据")
for _ in range(5):
time.sleep(random.randint(1, 2))
data.append(random.randint(1, 100))
print("数据生成完成,通知处理线程")
event.set()
def data_processor():
print("数据处理器等待数据")
event.wait()
print("开始处理数据:", data)
thread1 = threading.Thread(target=data_generator)
thread2 = threading.Thread(target=data_processor)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
在上述案例中,通过 Event 实现了数据生成和处理线程之间的协调和通信。
import threading
import time
# 创建一个事件对象
event = threading.Event()
def initializer():
print("初始化操作...")
time.sleep(3) # 模拟初始化操作
print("初始化完成,设置事件")
event.set() # 设置事件,通知其他线程
def dependent_task(n):
print(f"线程 {n} 等待初始化完成...")
event.wait() # 等待事件
print(f"线程 {n} 开始执行任务")
# 创建并启动初始化线程
init_thread = threading.Thread(target=initializer)
init_thread.start()
# 创建并启动依赖线程
threads = []
for i in range(5):
t = threading.Thread(target=dependent_task, args=(i,))
threads.append(t)
t.start()
init_thread.join()
for t in threads:
t.join()
在这个案例中,一个线程进行初始化操作,其他线程等待初始化完成后开始执行各自的任务。通过事件对象,确保线程按顺序启动。
模拟一个视频下载和视频播放的场景:
import threading
import time
event = threading.Event()
def download_video():
print("开始下载视频")
time.sleep(5) # 模拟下载耗时
print("视频下载完成,通知播放")
event.set()
def play_video():
print("等待视频下载")
event.wait()
print("开始播放视频")
# 创建并启动下载线程
download_thread = threading.Thread(target=download_video)
download_thread.start()
# 创建并启动播放线程
play_thread = threading.Thread(target=play_video)
play_thread.start()
download_thread.join()
play_thread.join()
在这个案例中,download_video 函数模拟视频下载的过程,完成后通过设置事件通知 play_video 函数可以开始播放视频。play_video 函数则等待下载完成的通知,然后进行播放。
这可以类比到实际的视频应用中,通过事件来协调下载和播放两个不同的操作,确保播放在下载完成后进行。
更新时间:2024-06-30 18:00:13 标签:python threading 线程 事件对象