python之event【事件】详解编程语言

# 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态 
#举个例子,比如红绿灯是一个线程,三辆汽车是3个线程,如果为红灯,则三个汽车的线程必须 
#要停止,如果是绿灯,则三个汽车的线程就可以跑起来 
 
 
 
import threading 
 
#创建一个事件 
event = threading.Event() 
 
 
#如果标签没有设置,则线程会一直等待,直到标签的状态被设置,如果设定了标签,则这里的 
#wait就不阻塞了,该动作什么都不做,如果没有设置,则该wait这里就一直阻塞,无论有多线程 
#都可以等待一个事件 
# event.wait() 
 
 
#设定标签和清空标签 
event.set() 
event.clear() 
 
#下面是一个红绿灯例子,很有意思 
# import threading 
# import time 
# import random 
# def light(): 
# #定义了一个灯的函数 
#     if not event.is_set():   #如果事件未定义,则设置该标签,设置该标签,则如果有线程在等待这个标签,就不会出现阻塞,也就是说初始状态是绿灯 
#         event.set() 
#     count = 0 
#     while True: 
#         if count < 10: 
#             #如果事件小于10,则不对事件做任何处理 
#             print("/033[42;1m----green light on----/033[0m") 
#         elif count < 15: 
#             #如果事件小于15,则不对事件做任何处理 
#             print("/033[43;1m----yellow light on----/033[0m") 
#         elif count < 20: 
#             #如果事件小于20,也就是说如果时间在15和20之间,则进入红灯状态,如果是红灯状态,则汽车就要阻塞,要实现阻塞,我们就需要对事件设置状态 
#             if event.is_set(): 
#                 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(1) 
#         if event.is_set(): 
#             #如果事件设置了状态,则后面的语句不阻塞,照常执行 
#             print("cat [%(name)s] is running" %{"name":n}) 
#         else: 
#             event.wait() 
#             #如果这个时间没有设置状态,则该事件一直阻塞在这里,等待该事件被设置状态 
#             print("cat [%(name)s] is wait for red light" % {"name": n}) 
# 
# 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() 
# 
 
 
import threading 
import time 
import random 
 
# 1、我们先定义一个灯的函数,由灯的线程去调用这个函数,绿灯是允许通过,红灯是不允许通过,其中绿灯10s,红灯也是10s,这里我们就要用到事件 
# 如果是绿灯,我们则设置事件的状态,如果是红灯,我们则取消事件的状态,初始状态为红灯 
def light(): 
    if event.is_set(): 
        #设置初始状态,该初始状态为事件没有状态,则进程一直会阻塞 
        event.clear() 
    count = 0 
    while True: 
        #进入交通灯灯循环的状态 
        if count < 10: 
            print("/033[41;1m----red light on----/033[0m") 
        elif count < 20: 
            print("/033[42;1m----green light on----/033[0m") 
            if not event.is_set(): 
                event.set() 
            else: 
                pass 
        else: 
            count = 0 
            if event.is_set(): 
                event.clear() 
        count += 1 
        time.sleep(1) 
 
 
def car(n): 
    while True: 
        time.sleep(1) 
        if event.is_set(): 
            print("car [%(name)s] is running" %{"name":n}) 
        else: 
            print("car [%(name)s] is waiting for red light" % {"name": n}) 
            event.wait() 
 
# 2、我们在定义一个车的函数,由车的线程去调用这个函数 
 
 
if __name__ == '__main__': 
    light_thread = threading.Thread(target=light) 
    light_thread.start() 
    for i in range(3): 
        t = threading.Thread(target=car, args=[i,]) 
        t.start() 

  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20881.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论