在上一篇文章中【python】详解threading模块:Condition类的使用(三),详细解释了condition类的使用,可以进行线程之间的通,通过threading.Condition的notify方法实现。threading模块提供Event类实现线程之间的通信。

很多时候,线程之间会有互相通信的需要。常见的情形是次要线程为主要线程执行特定的任务,在执行过程中需要不断报告执行的进度情况。

threading.Event可以使一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另一个线程调用set()方法将内置标志设置为True时,Event通知所有等待状态的线程恢复运行;调用clear()时重置为 False。还可以通过isSet()方法查询Envent对象内置状态的当前值

Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。
  • isSet(): 当内置标志为True时返回True。
  • set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
  • clear(): 将标志设为False。
  • wait([timeout]): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
import threading
import time
event = threading.Event()
def func():
    # 等待事件,进入等待阻塞状态
    print('%s wait for event...' % threading.currentThread().getName())
    event.wait()
    # 收到事件后进入运行状态
    print('%s recv event.' % threading.currentThread().getName())
t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()

time.sleep(2)

# 发送事件通知
print('MainThread set event.')
event.set()
----------------------------------------------------
Thread-6 wait for event...Thread-7 wait for event...

MainThread set event.
Thread-6 recv event.
Thread-7 recv event.
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐