Event

简述

  • 简单概述:实例化的Event类本质上就是一个布尔值,但是,这个布尔值自带很多方法,可以灵活地改变自身的bool值,通过自生布尔值的改变,来控制一些如循环这样的进程的运行情况。
  • 它可以作为全局变量,用于对多个线程进行协调
  • 我们常常将其与threading.Threading(target=function)进行结合,它的值可以在function中进行变换控制function的运行情况,同时就控制了线程的运行情况。

常用类方法介绍

  • 其常用方法的基本介绍:
    threading.Event 对象内部维护了一个布尔标志,初始值为 False。线程可以通过调用 set() 方法将标志设置为 True,通过 clear() 方法将标志重置为 False,使用 is_set() 方法检查标志的当前状态,以及使用 wait() 方法让线程阻塞,直到标志变为 True

set()

Event 对象内部的标志设置为 True。所有正在等待这个事件的线程将被唤醒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import threading

event = threading.Event()

def worker():
print("Worker is waiting for the event...")
event.wait()
print("Worker received the event and is now working.")

thread = threading.Thread(target=worker)
thread.start()

# 设置事件,唤醒等待的线程
event.set()
thread.join()

clear()

Event 对象内部的标志重置为 False。之后调用 wait() 方法的线程将再次阻塞,直到标志再次被设置为 True

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import threading
import time

event = threading.Event()

def worker():
print("Worker is waiting for the event...")
event.wait()
print("Worker received the event and is now working.")
time.sleep(2)
print("Worker is done.")
event.clear()
print("Event is cleared.")

thread = threading.Thread(target=worker)
thread.start()

# 设置事件,唤醒等待的线程
event.set()
thread.join()

print("Trying to wait again...")
event.wait()
print("Event is set again.")

is_set()

检查 Event 对象内部的标志是否为 True。返回一个布尔值。

1
2
3
4
5
6
7
import threading

event = threading.Event()
print(event.is_set()) # 输出: False

event.set()
print(event.is_set()) # 输出: True

wait(timeout=None)

让当前线程阻塞,直到 Event 对象内部的标志变为 True,或者超过指定的 timeout 时间(以秒为单位)。如果 timeoutNone,则线程将一直阻塞,直到标志变为 True。返回一个布尔值,表示标志是否为 True

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import threading
import time

event = threading.Event()

def setter():
time.sleep(2)
event.set()
print("Event is set.")

thread = threading.Thread(target=setter)
thread.start()

print("Waiting for the event...")
result = event.wait(timeout=3)
if result:
print("Event was set.")
else:
print("Timed out waiting for the event.")