【Python】用事件Event管理线程threading

0. 背景

写了段涉及多线程的程序,但并不想要个别线程一直执行。希望能在有需要的时候唤醒它们,不需要的时候让它们阻塞。感觉事件比较满足想要的效果。

事件对象

这是线程之间通信的最简单机制之一:一个线程发出事件信号,而其他线程等待该信号。

1. 事件

官方文档对事件对象的解释清晰明了:

一个事件对象管理一个内部标识,调用 set() 方法可将其设置为 true ,调用 clear() 方法可将其设置为 false ,调用 wait() 方法将进入阻塞直到标识为 true 。

更为详细的内容请移步官方文档

2. 用法

2.1 代码示例

以下代码演示了用事件管理线程的一种方式。其中event.set()event.clear()可以被用在需要触发相关事件的地方,例如按钮。

import threading
import time

event = threading.Event()  # 实例化事件对象


def print_1():  # 第一个线程的调用对象
    while True:
        event.wait()  # 阻塞线程直到被唤醒
        print(1)
        time.sleep(1)


def print_2():  # 第二个线程的调用对象
    while True:
        print(2)
        time.sleep(1)


if __name__ == '__main__':
    # 开始线程活动
    threading.Thread(target=print_1).start()
    threading.Thread(target=print_2).start()

    while True:
        print('event.set()')
        event.set()  # 唤醒被阻塞的线程
        time.sleep(5)

        print('event.clear()')
        event.clear()  # 阻塞线程
        time.sleep(5)

2.2 运行效果

以下为上述代码的运行效果。可以看到,每过5秒,输出1的线程会被阻塞或唤醒一次。

2
event.set()
1
12

12

12

12

event.clear()
2
2
2
2
2
event.set()
1
2
1
2
1
2
1
2
1
2
event.clear()
2
2
2
2
2
event.set()
1
2
1
2
1
2
1
2
1
2
event.clear()
2
2
2
2
2
event.set()
1
2
1
2