• Events-事件-红绿灯


    Event: 用于线程之间状态的同步。对全局变量不断地做修改。 

    Event=threading.Event()  #生成1个event的对象

    Event.wait() #等着设定全局变量。检测标志位是否有设置,如果标志位没有设置的话,会一直卡在这里。等待标志位被设定。

                          如果标志位被设定了,代表绿灯,直接通行。wait不阻塞。

                           如果标志位被清空,代表红灯,wait等待。

                            多个线程可以等待同一个event的标志位的变化。

    Event.set() #设置一个标志位,相当于全局变量

    Event.clear() #清空标志位

    Event.is_set() #判断是否设置了标志位

    理解点:

    1.车的线程与红绿灯的线程之间有了关联,车的线程会根据红绿灯的线程而变化。

    2.每一次状态的切换,就是一次事件的发生,会相应地做不同的事情。

       

    import time,threading
    
    event=threading.Event()
    
    def lighter():
        count=0
        event.set() #先设为绿灯
        while True:
            if count>5 and count<10: #改成红灯
                event.clear() #清空标志位,在红灯状态卡10s
                print('33[41;1mred light is on..33[0m')
            elif count>10:
                event.set()#变绿灯
                count=0
            else:
                print('33[42;1mgreen light is on..33[0m')
            time.sleep(1)
            count+=1
    
    def car(name):
        while True:
            if event.is_set(): #设置了标志位,代表绿灯
                print('[%s] running...'%name)
                time.sleep(1)
            else:
                print('[%s] red light,waiting..'%name)
                event.wait()
                print('[%s] green is on, start going.'%name )
    
    
    light=threading.Thread(target=lighter,)
    light.start()
    car1=threading.Thread(target=car,args=('Tesla',))
    car1.start()
    

    运行结果:

    green light is on..
    [Tesla] running...
    green light is on..
    [Tesla] running...
    green light is on..
    [Tesla] running...
    [Tesla] running...
    green light is on..
    [Tesla] running...
    green light is on..
    [Tesla] running...
    green light is on..
    [Tesla] running...
    red light is on..
    red light is on..
    [Tesla] red light,waiting..
    red light is on..
    red light is on..
    green light is on..
    [Tesla] green is on, start going.
    [Tesla] running...
    green light is on..
    [Tesla] running...
    
  • 相关阅读:
    python报错Enable tracemalloc to get the object allocation traceback
    解决pycharm每次新建项目都要重新安装一些第三方库的问题
    创建一个CA证书
    [转载]oracle 12C 《服务器、客户端安装》
    [转载]Windows Server 2016中添加AD域控制器
    [转载]Windows Server 2016中部署AD
    虚拟机 VMware Workstation Pro 15.5.0 及永久激活密钥
    Oracle给查询结果增加序列号
    创建自定义ssl证书用于https
    js:getAttribute
  • 原文地址:https://www.cnblogs.com/momo8238/p/7346387.html
Copyright © 2020-2023  润新知