python中多线程中event的使用-----------------即一个灵活的方法标志位,类似于java的等待唤醒机制(python与java不同的地方)

event是python中一个特有的标志位方法,他一共有三种方法

1.event.wait():如果标志位设定了,它不做任何事,如果没有设定,则将会锁住,等待标志位的设定

2.event.set():设置标志位

3.event.clear():清除标志位

这一种机制很类似于java中的等待唤醒机制,我们可以试想一下,我们在一个线程中,不断的设置和清除标志位,在另一个线程中用wait()方法,当设置标志位的时候另一个线程就会执行,当清除标志位的时候,另一个线程就会停止,从而实现对一个线程的控制。

下面我们通过一个示例代码对其进行详细的解释:

#在这里我们模仿一个红绿灯的应用场景,绿灯亮的时候,车可以通过,红灯亮的时候要等待。
import time
import threading

event = threading.Event()#首先要获取一个event对象

def lighter():
    count = 0
    event.set() #先设置绿灯
    while True:
        if count >5 and count < 10: #改成红灯
            event.clear() #把标志位清了
            print("红灯")
        elif count >10:
            event.set() #变绿灯
            count = 0
        else:
            print("绿灯")
        time.sleep(1)
        count +=1

def car(name):
    while True:
        if event.is_set(): #代表绿灯
            print("[%s] 正在开过"% name )
            time.sleep(1)
        else:
            print("[%s] 正在等待" %name)
            event.wait()#车的这个线程就锁在这里不动了,一直到set的时候,才会继续执行car的这个线程


light = threading.Thread(target=lighter,)
light.start()

car1 = threading.Thread(target=car,args=("奔驰",))
car1.start()

结果:

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

红灯[奔驰] 正在等待

红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

红灯[奔驰] 正在等待

红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过红灯

猜你喜欢

转载自blog.csdn.net/qq_41901915/article/details/82703429