import threading
import time
def worker(event):
while not event.is_set():
print("Worker is working...")
time.sleep(1)
print("Worker received exit signal, exiting...")
if __name__ == "__main__":
exit_event = threading.Event()
thread = threading.Thread(target=worker, args=(exit_event,))
thread.start()
# 主线程执行一些其他任务
time.sleep(5)
# 发出退出信号
exit_event.set()
# 等待线程结束
thread.join()
print("Main thread exits.")
原理解释
Event
对象:threading.Event
是一个简单的线程同步对象,它内部有一个标志位。
- 工作线程:在
worker
函数中,使用while not event.is_set()
循环来持续检查Event
对象的状态。只要Event
对象的标志位未设置(is_set()
返回False
),线程就会继续执行任务。当标志位被设置(is_set()
返回True
),线程就会收到退出信号并结束循环,执行后续的清理工作然后退出。
- 主线程:主线程在启动工作线程后,执行一些其他任务。在合适的时机,通过调用
exit_event.set()
设置Event
对象的标志位,向工作线程发送退出信号。最后,主线程调用thread.join()
等待工作线程结束,确保程序能够优雅退出。