1.python事件Event相关函数介绍
set() — 全局内置标志Flag,将标志Flag 设置为 True,通知在等待状态(wait)的线程恢复运行
isSet() — 获取标志Flag当前状态,返回True 或者 False
wait() — 一旦调用,线程将会处于阻塞状态,直到等待其他线程调用set()函数恢复运行
clear() — 将标志设置为False
2.python事件Event原理
事件event中有一个全局内置标志Flag,值为 True 或者False。使用wait()函数的线程会处于阻塞状态,此时Flag指为False,直到有其他线程调用set()函数让全局标志Flag置为True,其阻塞的线程立刻恢复运行,还可以用isSet()函数检查当前的Flag状态
3.要求
定义一个全局变量列表:test_list,创建两个函数(test_list_one和test_list_two)
test_list_one:for遍历10个数字添加到列表中,且没添加一个数字都要睡眠2秒钟
test_list_two: for遍历这个全局列表10次,每次都pop() 一个数字,每次pop()一次后睡眠1秒钟
最后,开启两个线程,先起 test_list_two() 最后起test_list_two()
4.没有event时
def test_list_one():
print("--------test_list_one---------")
for i in range(0,11):
print("--------test_list_one---循环---%d" % i)
test_list.append(1)
time.sleep(1)
print("--------test_list_one----结束")
def test_list_two():
print("--------test_list_two---------")
for i in range(0, 11):
print("--------test_list_two---循环---%d" % i)
test_list.pop()
time.sleep(1)
print("--------test_list_two----结束")
event = threading.Event()
event.clear()
test_list = list()
if __name__ == '__main__':
threading.Thread(target=test_list_two, ).start()
threading.Thread(target=test_list_one,).start()
结果是报错:应为此时线程无法控制,当一个函数被阻塞时,它会去执行其他没有阻塞的函数,应为pop()的时间比append()的时间短,所以会出现pop()空列表的情况,报错:
5.使用event时
def test_list_one():
print("--------test_list_one---------")
for i in range(0,11):
print("--------test_list_one---循环---%d" % i)
test_list.append(1)
time.sleep(1)
print("--------test_list_one----结束")
event.set()
def test_list_two():
print("--------test_list_two---------")
event.wait()
for i in range(0, 11):
print("--------test_list_two---循环---%d" % i)
test_list.pop()
time.sleep(1)
print("--------test_list_two----结束")
event = threading.Event()
event.clear()
test_list = list()
if __name__ == '__main__':
threading.Thread(target=test_list_two, ).start()
threading.Thread(target=test_list_one,).start()
注意:event.clear(), event.wait(),event.set() 的作用,第1部分有
结果:时按照线程同步执行