zoukankan      html  css  js  c++  java
  • (6)进程---Event事件

    # 阻塞事件 :

    e = Event()生成事件对象e

    e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False]

    e.wait(2) 传参,相当于time.sleep(2)

    # 如果是True 那就不加阻塞

    # 如果是False 就加阻塞

    # 控制这个属性的值

    # set()方法 将这个属性的值改成True

    # clear()方法 将这个属性的值改成False

    # is_set()方法 判断当前的属性是否为True (默认上来是False)

     例:模拟红绿灯,假设有20辆小车全部通过后,红绿灯终止;

    from multiprocessing import Process, Event
    import time, random
    def traffic_light(e):
        # traffic_light 只做一件事就是红灯和绿灯的变色效果
        print("红灯亮")
        while True:
            # 默认is_set 获取到的值是False
            if e.is_set():
                # 红灯区间
                time.sleep(1)
                print("红灯亮")
                e.clear()  # False
            else:
                # 绿灯区间
                time.sleep(1)
                print("绿灯亮")
                e.set()  # True
    
    
    def car(e, i):
        # e.is_set() 为False时成立
        if not e.is_set():
            print("car %s 在等待" % (i))
            e.wait()
        print("car %s 通过了" % i)
    
    
    if __name__ == "__main__":
        e = Event()
        lst = []
        p = Process(target=traffic_light, args=(e,))
        p.daemon = True
        p.start()
    
        for i in range(20):
            time.sleep(random.randrange(0, 2))
            p = Process(target=car, args=(e, i))
            p.start()
            lst.append(p)
        for p in lst:
            p.join()
    
        print("程序彻底跑完~")
    View Code

    执行结果: 如果想车辆跑完了,红绿灯继续运行,去掉守护进程和末尾的阻塞就可以了

    红灯亮
    绿灯亮
    car 0 通过了
    car 1 通过了
    红灯亮
    car 3 在等待
    car 2 在等待
    car 4 在等待
    car 5 在等待
    car 6 在等待
    绿灯亮
    car 4 通过了
    car 3 通过了
    car 2 通过了
    car 5 通过了
    car 6 通过了
    car 7 通过了
    car 9 通过了
    car 8 通过了
    car 10 通过了
    红灯亮
    car 11 在等待
    绿灯亮
    car 11 通过了
    car 13 通过了
    car 12 通过了
    car 14 通过了
    红灯亮
    car 15 在等待
    绿灯亮
    car 15 通过了
    car 17 通过了
    car 16 通过了
    car 18 通过了
    红灯亮
    car 19 在等待
    绿灯亮
    car 19 通过了
    程序彻底跑完~
    
    Process finished with exit code 0
    View Code
  • 相关阅读:
    orm 对象关系映射 指 表与类之间的映射 # 40
    事务 视图 触发器 函数 (内置) 存储过程 流程控制 索引 # 39
    exist 存在 Python操作mysql pymysql sql注入问题 # 38
    基本查询语句与方法 多表查询 # 37
    外键 #36
    存储引擎 索引 数据类型 约束条件 # 35
    mysql安装 登录 修改密码 库,表,记录(增删改查) # 34
    进程池和线程池 协程 # 33
    GIL全局解释器锁
    # 并发编程 -进程理论-进程的方法
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787242.html
Copyright © 2011-2022 走看看