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("\033[42;1m--green light on--\033[0m") elif count <13: print("\033[43;1m--yellow light on --\033[0m") elif count <20: if event.isSet(): event.clear() print("\033[41;1m--red light on-- \033[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--
...