• Python并发编程-事件,红绿灯控制


    事件用来控制多个进程同时执行或者阻塞

    • set和clear
      • 分别用来修改一个事件的状态,True或者False
    • is_set 用来查看一个事件的状态
    • wait 是依据事件的状态来决定自己是否在wait处阻塞
      • False阻塞, True不阻塞
    from multiprocessing import Event
    #一个信号可以使得所有的进程都进入阻塞状态
    #也可以控制所有的进程解除阻塞
    #一个事件被创建之后, 默认是阻塞状态
    e = Event() #创建了一个事件
    print(e.is_set()) #查看一个事件的状态,默认被设置成阻塞
    print(12345)
    e.set() #将这个事件的状态改为True,即不阻塞
    e.wait() #依据e.is_set()的值来决定是否阻塞
    print(12345)
    e.clear() #将这个事件的状态改为False
    print(e.is_set())
    e.set()
    e.wait()  #有条件的等待,等待这个事件的信号变成True
    print('*'* 10)
    print(e.is_set())
    e.clear() #将这个事件的状态改为False,但是并没有wait()将其阻塞,故下面的代码还是可以打印
    print('*'* 10)
    

    红绿灯事件

    from multiprocessing import Event, Process
    import time
    import random
    def light(e):
        while True:
            if e.is_set():
                e.clear()
                print('33[31m红灯亮了33[0m')
            else:
                e.set()
                print('33[32m绿灯亮了33[0m')
            time.sleep(2)
    
    def cars(e,i):
        if not e.is_set(): #表示'红灯亮了:':
            print('car%i在等待'%i)
            e.wait() #'等红灯'阻塞直到得到一个事件状态变为True的信号
        #'车通行'
        print('33[0;32;40mcar%i通过33[0m'%i)
    
    if __name__ == '__main__':
        e = Event()
        traffic = Process(target=light,args=(e,))
        traffic.start()
        for i in range(20):
    
            car = Process(target=cars, args=(e,i))
            car.start()
            time.sleep((random.random()))
    
  • 相关阅读:
    使用EFCore连接现有数据库
    C#面试题总结
    xamarin学习--发布apk安装包
    xamarin学习--导航参数注意事项
    centos8 安装 gitlab
    mvc添加全局过滤器
    Windows平台查看端口占用情况
    asp.net core cli---创建一个不启用https的项目
    asp.net core cli
    启动nuxt项目报错WARN node unsupported "node@v8.9.3" is incompatible with chalk@^4.1.0, expec...
  • 原文地址:https://www.cnblogs.com/konglinqingfeng/p/9691120.html
Copyright © 2020-2023  润新知