跳转至

threading.Event()

通过threading.Event()可以创建一个事件管理标志,该标志(event)默认为False,event对象主要有四种方法可以调用:

  • event.wait(timeout=None):调用该方法的线程会被阻塞,如果设置了timeout参数,超时后,线程会停止阻塞继续执行;

  • event.set():将event的标志设置为True,调用wait方法的所有线程将被唤醒;

  • event.clear():将event的标志设置为False,调用wait方法的所有线程将被阻塞;
  • event.isSet():判断event的标志是否为True。
import threading
import time
event = threading.Event()
def func():
    # 等待事件,进入等待阻塞状态
    print('%s wait for event...' % threading.currentThread().getName())
    print("event.is_set():"+str(event.is_set()))
    event.wait()
    # 收到事件后进入运行状态
    print('%s recv event.' % threading.currentThread().getName())
    print("event.is_set():"+str(event.is_set()))
t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()

time.sleep(2)

# 发送事件通知
print('MainThread set event..............')
event.set()

结果:

Thread-1 wait for event...
event.is_set():False
Thread-2 wait for event...
event.is_set():False
MainThread set event..............
Thread-2 recv event.
event.is_set():True
Thread-1 recv event.
event.is_set():True

进程已结束,退出代码为 0

用继承方式实现

import threading
import time

class MyThread(threading.Thread):
    event = threading.Event()

    def run(self):
        # 等待事件,进入等待阻塞状态
        print('%s wait for event...' % threading.currentThread().getName())
        print("event.is_set():" + str(MyThread.event.is_set()))
        MyThread.event.wait()

        # 收到事件后进入运行状态
        print('%s recv event.' % threading.currentThread().getName())
        print("event.is_set():" + str(MyThread.event.is_set()))


t1 = MyThread()
t2 = MyThread()
t1.start()
t2.start()

time.sleep(2)

# 发送事件通知
print('MainThread set event..............')
MyThread.event.set()

结果:

Thread-1 wait for event...
event.is_set():False
Thread-2 wait for event...
event.is_set():False
MainThread set event..............
Thread-2 recv event.
event.is_set():True
Thread-1 recv event.
event.is_set():True

进程已结束,退出代码为 0