zoukankan      html  css  js  c++  java
  • 锁Lock,信号量Semaphore,事件机制Event

    银行取钱
    from multiprocessing import Process,Lock,Value
    import time
    def get_money(num):
        for i in range(100):
            num.value -= 1
            time.sleep(0.01)
    def put_money(num):
        for i in range(100):
            num.value += 1
            time.sleep(0.01)
    if __name__ == '__main__':
        num = Value("i",100)
        p_g = Process(target=get_money,args=(num,))
        p_g.start()
        p_p = Process(target=put_money,args=(num,))
        p_p.start()
        p_g.join()
        p_p.join()
        print(num.value)
    
    加锁
    from multiprocessing import Process,Lock,Value
    import time
    def get_money(num,l):
        l.acquire()
        for i in range(100):
            num.value -= 1
            print(num.value)
            time.sleep(0.01)
        l.release()
    def put_money(num,l):
        l.acquire()
        for i in range(100):
            num.value += 1
            print(num.value)
            time.sleep(0.01)
        l.release()
    if __name__ == '__main__':
        num = Value("i",100)
        l = Lock()
        p_g = Process(target=get_money,args=(num,l))
        p_g.start()
        p_p = Process(target=put_money,args=(num,l))
        p_p.start()
        p_g.join()
        p_p.join()
        print(num.value)
    12306抢票
    from multiprocessing import Process,Lock
    import time
    def check_ticket(i):
        with open("余票")as f:
            num = f.read()
        print("第%s个人查到剩余%s张票" % (i,num))
    def buy_ticket(i,):
        with open("余票")as f:
            num = int(f.read())
            time.sleep(0.1)
        if num > 0:
            print("33[32m第%s个人买到了票33[0m" % i)
            num -= 1
        else:
            print("33[35m第%s个人没有买到了票33[0m" % i)
        time.sleep(0.1)
        with open("余票","w")as f:
            f.write(str(num))
    if __name__ == '__main__':
        for i in range(10):
            p_c = Process(target=check_ticket,args=(i+1,))
            p_c.start()
        for i in range(10):
            p_b = Process(target=buy_ticket,args=(i+1,))
            p_b.start()
    
    
    加锁
    from multiprocessing import Process,Lock
    import time
    def check_ticket(i):
        with open("余票")as f:
            num = f.read()
        print("第%s个人查到剩余%s张票" % (i,num))
    def buy_ticket(i,l):
        l.acquire()
        with open("余票")as f:
            num = int(f.read())
            time.sleep(0.1)
        if num > 0:
            print("33[32m第%s个人买到了票33[0m" % i)
            num -= 1
        else:
            print("33[35m第%s个人没有买到了票33[0m" % i)
        time.sleep(0.1)
        with open("余票","w")as f:
            f.write(str(num))
        l.release()
    if __name__ == '__main__':
        l = Lock()
        for i in range(10):
            p_c = Process(target=check_ticket,args=(i+1,))
            p_c.start()
        for i in range(10):
            p_b = Process(target=buy_ticket,args=(i+1,l))
            p_b.start()

    信号量

    from multiprocessing import Semaphore,Lock
    l = Semaphore(3)
    l.acquire()  #拿走钥匙,锁门
    print(123)
    l.acquire()
    print(456)
    l.release()  #还回钥匙,供其他人开门
    print(654)
    l.acquire()
    print(789)
    l.release()
    print(321)
    排队上大号
    from multiprocessing import Process,Semaphore
    import time
    import random
    def func(i,s):
        s.acquire()
        print("33[31m 第%s个人进卫生间 33[0m" % i)
        time.sleep(random.randint(2,5))
        print("33[32m 第%s个人出卫生间 33[0m" % i)
        s.release()
    if __name__ == '__main__':
        s = Semaphore(5)#初始化卫生间可以供5个人同时使用
        for i in range(20):
            p = Process(target=func,args=(i+1,s))
            p.start()

    事件机制

    from multiprocessing import Event
    e = Event()
    e.is_set()
    print(e.is_set())
    e.wait()
    print(123)
    结果:False
    
    from multiprocessing import Event
    e = Event()
    e.is_set()
    print(e.is_set())
    e.set()
    e.wait()
    print(e.is_set())
    print(123)
    结果:
    False
    True
    123
    
    from multiprocessing import Event
    e = Event()
    e.is_set()
    print(e.is_set())
    e.set()
    e.wait()
    print(e.is_set())
    print(123)
    e.clear()
    print(e.is_set())
    e.wait()
    print(123)
    结果:
    False
    True
    123
    False
    
    总结:
    事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
    当is_set()的bool值为False时,e.wait()是阻塞状态
    当is_set()的bool值为True时,e.wait()是非阻塞状态
    当使用set()时,是把is_set的bool变为True
    当使用clear()时,是把is_set的bool变为False
    模拟红绿灯
    from multiprocessing import Process,Event
    import time
    def light(e):
        '''红绿灯函数'''
        while 1: #红绿灯循环亮
            if e.is_set(): #True 绿灯亮着,可以通车
                time.sleep(5) #绿灯亮灯时间为5秒
                print("33[31m 红灯亮! 33[0m")  #5秒后,红灯亮
                e.clear() #将is_sent设置为False,
            else:
                time.sleep(5)  #红灯亮灯时间为5秒
                print("33[32m 绿灯亮 33[0m") #5秒后,绿灯亮
                e.set() #将is_set设置为True
    def car(i,e):
        e.wait() #等待灯的指示,如果is_set为True,通车,反之,停车等待
        print("第%s辆车通过了红灯" %i)
    if __name__ == '__main__':
        e = Event()
        l = Process(target=light,args=(e,))
        l.start()
        for i in range(50):
            if i %3 ==0:
                time.sleep(2)
            c = Process(target=car,args=(i+1,e))
            c.start()
  • 相关阅读:
    使用socket BPF/Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
    使用Iperf工具测试android系统网络wifi的吞吐量wifithrougput
    html input中 button和submit的区别
    Linux转发性能评估与优化(转发瓶颈分析与解决方案)
    交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
    MySQL查询不区分大小写的sql写法
    Docker镜像保存save、加载load
    将Spring-boot应用部署到Docker容器
    Docker 安装使用
    Scalatra文件下载时中文乱码
  • 原文地址:https://www.cnblogs.com/chenyibai/p/9511671.html
Copyright © 2011-2022 走看看