• 多线程中的event,用于多线程的协调


    '''
    简单的需求:红绿灯,红灯停,绿灯行
    一个线程扮演红绿灯,每过一段时间灯变化,3-5个线程扮演车,红灯停,绿灯行
    红绿灯线程和车的线程会相互依赖
    这种场景怎么实现?---事件
    切换一次灯就是一次事件,这次事件的变化造成其他状态的变化
    事件是用于线程之间的数据同步的。事件变化其他线程相应作出变化
    应该设置一个全局变量当做灯,车的线程监测全局变量。
    事件就是封装的一个全局变量
    event = threading.event()
    event.set()   设置标志位,该状态下程序激活,“绿灯”
    event.clear()  清空标志位,该状态下程序阻塞,“红灯”
    event.wait()   一直监测标志位。如果标志位没被设置就阻塞(红灯),标志位一设置就激活(绿灯)
    event.is_set() 判断标志位是否被设定
    '''
    import time
    import threading
    
    event = threading.Event()
    def lighter():
        count = 0
        event.set()   # 刚进来的时候是绿灯
        while True:
            if  4 < count < 10:
                event.clear()
                print("[信号灯]:红,不能通行")
            elif count >= 10:
                event.set()
                count = 0
            else:
                event.set()
                print("[信号灯]:绿,可以通行")
            time.sleep(1)
            count += 1
    def car(name):
        while True:
            if event.is_set():
                print("{0}: green , running...".format(name))
                time.sleep(1)
            else:
                print("{0}: RED , STOP...".format(name))
                event.wait()
                print("{0}: 绿灯亮了 , 继续前进...".format(name))
    
    light = threading.Thread(target=lighter,)
    light.start()
    car1 = threading.Thread(target=car, args=("HONDA",))
    car1.start()
  • 相关阅读:
    转:Redis 3.2.1集群搭建
    转:GET和POST两种基本请求方法的区别
    web.xml中 /和/*的区别
    java main方法里调用mapper
    Java定时任务
    @Resource与@Autowired注解的区别
    解决Eclipse EE部署web项目在Tomcat webapp目录下没有工程文件的问题
    get方式中文参数乱码解决方法
    生成excel并发送给客户端
    java把汉字转换成拼音
  • 原文地址:https://www.cnblogs.com/staff/p/9690594.html
Copyright © 2020-2023  润新知