zoukankan      html  css  js  c++  java
  • python语法基础-并发编程-进程-其他

    ###############    多进程的信号量    ##############

    # 多进程的信号量
    
    from multiprocessing import Process
    import time,random
    from multiprocessing import Semaphore
    # ktv只有1个房间,1个房间只能装4个人,但是这样写就是20个人都进入到房间了,
    # 假设ket门口有4把钥匙,一个进程来了那一把钥匙,然后关门,这样只有4个进程能拿到,剩下的之后1个进程出来了才可以继续其他的进程,
    # 这个概念就叫做信号量,同一时间就只有四个人,
    def ktv(i,sem):
        sem.acquire()  # 获取钥匙
        print("%d进入ktv"%i)
        time.sleep(random.randint(60,180))  # 这是每一个人唱歌1-3分钟
        print("%d走出ktv"%i)
        sem.release()  # 还钥匙
    
    if __name__ == "__main__":
        sem = Semaphore(4)  # 这就是设置有多少把钥匙,  信号量的英文就是:Semaphore
        for i in range(20):
            p=Process(target=ktv,args=(i,sem))
            p.start()

    ###############    进程的事件    ##############

    # 进程的事件
    
    
    # 事件
    import time
    from multiprocessing import Event, Process
    
    
    # 一个信号,可以使所有的进程都进入阻塞状态,也可以控制所有信号都解除阻塞,
    # 一个事件创建之后,默认是阻塞状态,
    # e = Event()  # 创建一个事件
    # print(e.is_set())  # 查看一个事件是否是阻塞状态,
    # print(123445)
    # e.set()  # 这是把阻塞的状态改为true,
    # print(e.is_set())
    # e.wait()  # 根据e.is_set()的结果,如果是false,就会阻塞,如果是true就会不阻塞
    # print(12344)
    # e.clear()  # 这是把阻塞的状态改为false
    # print(e.is_set())
    # e.wait()  # 虽然阻塞了,但是一定要有这个wait,才会阻塞后面的代码,
    # print(444444)
    
    
    # 举一个例子,红绿灯
    
    # 每一个进程表示一辆车,
    def car(e,i):
        #e.is_set() 默认返回False 代表的是绿灯
        if not e.is_set():
            print("car%s在等待"%i)
            e.wait()
        print("car%s通行了"%i)
    
    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)
    
    
    if __name__ == '__main__':
        e=Event()
        # 模拟启动交通灯
        p1=Process(target=light,args=(e,))
        p1.daemon=True
        p1.start()
        #模拟20辆小车
        for i in range(20):
            import random
            time.sleep(random.uniform(0,2))
            p2=Process(target=car,args=(e,i))
            p2.start()
        print("程序彻底结束!")
  • 相关阅读:
    Xcode 构建规则
    创建带阴影,有圆角的UIView的正确方式
    EffectiveC#12,13,14--成员初始化
    EffectiveC#11--选择foreach循环
    EffectiveC#9--明白几个相等运算之间的关系
    EffectiveC#8--确保0对于值类型数据是有效的(初始化问题)
    NET基础课--泛型(NET之美)
    NET基础课-- 类型基础(NET之美)
    EffectiveC#7--选择恒定的原子值类型数据
    EffectiveC#6--区别值类型数据和引用类型数据
  • 原文地址:https://www.cnblogs.com/andy0816/p/12375736.html
Copyright © 2011-2022 走看看