zoukankan      html  css  js  c++  java
  • 线程Event事件

    事件(event)

    • 事件是不同线程之间的同步对象
    • enent可以通过设置、等待、清除一个标识(flag),来进行线程间的控制
    • 线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线程
    • 事件其实就相当于一个全局变量(设置为True,未设置为False),线程通过这个全局变量的状态来控制自身

    event只要set,clear,wait三个方法

    • 使用前先实例化event = threading.Event()
    • event.wait()#线程阻塞,等待标志位被设置
    • event.set()#设置标志位
    • event.clear()#清除标志位

    • enent.isSet()#标志位是否被设置

    红绿灯事件模型

    import threading
    import time,random
    
    event = threading.Event()
    #set为绿灯,clear为红灯
    def light():
        count = 0
        if not event.isSet():
            event.set()#设置初始状态为绿灯
        while True:
            if count <10:
                #绿灯
                print('33[1;42;1m绿灯-可以通行 %s33[0m'%count)
                event.set()
            elif count <13:
                #黄灯
                print('33[1;43;1m黄灯 %s33[0m' % count)
    
            elif count <25:
                #红灯
                print('33[1;41;1m红灯-禁止通行 %s33[0m' % count)
                event.clear()
            else:
                count = 0
                event.set()
            count +=1
            time.sleep(1)
    
    def car(n):
        while True:
            time.sleep(1)#random.randrange(3)
            if event.isSet():#绿灯状态
                print('car[%s] is running...'%str(n))
                #event.wait()
            else:
                print('car[%s] is waitting ...'%str(n))
                event.wait()#阻塞等待标志位被设定
    
    def main():
        t_light = threading.Thread(target=light)
        t_light.start()
        for i in range(3):
            t_car = threading.Thread(target=car,args=(i,))
            t_car.start()
    
    main()
    
  • 相关阅读:
    C#中使用MATLAB
    各种插值法及效果图对比
    Visual Studio中你所不知道的智能感知
    C#中使用Surfer
    XCode中连接使用GitHub
    个人作业Week1
    个人作业Week3
    个人作业Week2
    第一次作业——subway
    执行ajax加载页面中的js总结
  • 原文地址:https://www.cnblogs.com/limich/p/7477079.html
Copyright © 2011-2022 走看看