zoukankan      html  css  js  c++  java
  • 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("33[42;1m----green light on----33[0m")
    #         elif count < 15:
    #             #如果事件小于15,则不对事件做任何处理
    #             print("33[43;1m----yellow light on----33[0m")
    #         elif count < 20:
    #             #如果事件小于20,也就是说如果时间在15和20之间,则进入红灯状态,如果是红灯状态,则汽车就要阻塞,要实现阻塞,我们就需要对事件设置状态
    #             if event.is_set():
    #                 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(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("33[41;1m----red light on----33[0m")
            elif count < 20:
                print("33[42;1m----green light on----33[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()
    

      

  • 相关阅读:
    Python中pymssql 的使用操作
    Python连接mysql数据库及简单增删改查操作示例代码
    Python之模块和包的创建与使用
    SQL SERVER将多行数据合并成一行
    SQL Server根据子查询更新语句update
    在VMware虚拟机中安装windows server2016步骤详解(带图解)
    http请求错误合集
    第三方图标库(三)iconMoon
    第三方图标库学习(二)Font Awesome
    MapperScannerConfigurer的原理
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/7253930.html
Copyright © 2011-2022 走看看