zoukankan      html  css  js  c++  java
  • Python 实现红绿灯

    一、通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥信号灯,一个线程做车辆,车辆行驶按红灯停,绿灯行的规则。

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-21
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python线程锁的测试脚本
    
    import threading,time
    import random
    
    def light():
        if not event.isSet(): #如果没有设定event
            event.set() #wait就不阻塞 #绿灯状态
        count = 0
        while True:
            if count < 10:
                print("33[42;1m--green light on--33[0m")
            elif count <13:
                print("33[43;1m--yellow light on --33[0m")
            elif count <20:
                if event.isSet():
                    event.clear()
                print("33[41;1m--red light on-- 33[0m")
            else:
                count = 0
                event.set() #打开绿灯
            time.sleep(1)
            count +=1
    # def car(n):
    #     while 1:
    #         time.sleep(random.randrange(10))
    #         if event.isSet(): #绿灯
    #             print("car [%s] is running.." %n)
    #         else:
    #             print("car [%s] is waiting for the red light.." %n)
    def car(n):    #no bug version
        while 1:
            time.sleep(1) #让车慢点if event.isSet(): #绿灯
                print("car [%s] is running.." %n)
            else:
                print("car [%s] is waiting for the red light.." %n)
                event.wait() #不断检查flag有没有被设定,如果没有设定就等着,这个是输入event等待时间,可以精确到毫秒级
    if __name__ == "__main__":
        event = threading.Event()
        Light = threading.Thread(target=light)
        Light.start()
        for i in range(3):
            t = threading.Thread(target=car,args=(i,))
            t.start()

    执行结果:

    --green light on--
    --green light on--
    car [0] is running..
    --green light on--
    car [0] is running..
    --green light on--
    car [2] is running..
    --green light on--
    --green light on--
    --green light on--
    car [2] is running..
    --green light on--
    car [2] is running..
    --green light on--
    --green light on--
    car [1] is running..
    car [0] is running..
    --yellow light on --
    car [0] is running..
    --yellow light on --
    car [0] is running..
    --yellow light on --
    --red light on-- 
    --red light on-- 
    --red light on-- 
    car [1] is waiting for the red light..
    --red light on-- 
    car [0] is waiting for the red light..
    --red light on-- 
    car [2] is waiting for the red light..
    --red light on-- 
    --red light on-- 
    --green light on--
    --green light on--
    car [2] is running..
    --green light on--
    car [1] is running..
    --green light on--
    --green light on--
    car [1] is running..
    --green light on--
    car [0] is running..
    --green light on--
    --green light on--
    ...
  • 相关阅读:
    使用C# lock同时访问共享数据
    将两个DataTable合并成一个DataTable
    嵌套存储过程返回值的调用
    在 Sql Server 中使用 MD5 加密
    用DIV制作即时提示层 防止被select控件遮挡的方法
    操作Cookie公用代码
    JS实现回调例子
    ASP存储过程参数数据类型
    在asp中使用js的encodeURIComponent方法
    Uva 10250 The Other Two Trees
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/9998128.html
Copyright © 2011-2022 走看看