pythonl练习笔记——threading线程中的事件Event

时间:2021-11-30 15:36:25

1 事件Event

使用方法:e = threading.Event()

Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行。

Event事件提供了三个方法:wait等待、clear清除信号False、set设置信号True。

Event事件实现通信机制:全局定义了一个“Flag”(默认为False),若Flag信号被clear为False,则执行event.wait方法时会阻塞;若Flag信号被set为True,则执行event.wait方法时便不阻塞。

Event事件对象提供了is_set()方法判断内部信号Flag标志状态。

2 示例

import threading
import random
from time import sleep

a = 500

e = threading.Event()

def fun():
    while True:
        sleep(2)
        e.wait()
        global a
        print('a=',a)
        a -= random.randint(0,100)

t=threading.Thread(target=fun)
t.start()
while True:
    sleep(1)
    a += random.randint(0,10)
    if a>100:
        e.set()
    else:
        e.clear()

t.join()

运行

a= 503
a= 463
a= 457
a= 426...

说明:

(1)Event的默认标志为False,意味阻塞;

(2)Event置于线程对象中,可实现线程间通信,意味着一个线程的运行与否,与另外一个线程的通知信息有关。

(3)当一个线程因事件方法wait()而进入等待状态时,另外一个线程Flag为False时,则该线程会一直处于阻塞状态;直到另外一个进程通过set()方法将Flag标志设置为True时,Event事件会通知该线程恢复运行。

关于线程Event事件的深层次理解,可参考:Python学习总结笔记(5)--进程/线程Event机制使用时要注意的一个问题