# 线程之间用于交互的一个对象,这个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()

  

posted on 2017-07-29 10:31  bainianminguo  阅读(3081)  评论(0编辑  收藏  举报