• 并发编程---互斥锁---互斥锁与join的区别


    互斥锁

    互斥锁就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的。

    缺点:效率低,加锁过程复杂

    优点:增加了安全性

    from multiprocessing import Process,Lock
    import time
    
    def task(name, mutex):
        mutex.acquire() # 加锁
        print('%s 1' %name)
        time.sleep(1)
        print('%s 2' % name)
        time.sleep(1)
        print('%s 3' % name)
        mutex.release() # 释放锁
    
    if __name__ == '__main__':
        mutex=Lock()
        for i in range(3):
            p = Process(target=task,args=('进程%s' %i,mutex))
            p.start()
    '''
    打印结果:
    进程0 1
    进程0 2
    进程0 3
    进程1 1
    进程1 2
    进程1 3
    进程2 1
    进程2 2
    进程2 3
    '''
    互斥锁

    模拟抢票

    from multiprocessing import Process,Lock
    import json
    import time
    
    def search(name):
        time.sleep(1) # 模拟网络延迟
        dic = json.load(open('db.txt','r',encoding='utf-8'))
        print('<%s>查看剩余票数 [%s]' %(name, dic['count']))
    
    def get(name):
        time.sleep(1)
        dic = json.load(open('db.txt','r',encoding='utf-8'))
        if dic['count'] > 0:
            dic['count'] -= 1
            time.sleep(3)
            json.dump(dic,open('db.txt','w',encoding='utf-8'))
            print('<%s> 购票成功' %name)
    
    def task(name,mutex):
        search(name)  # 并发的进行
        mutex.acquire()
        get(name)
        mutex.release()
    
    if __name__ == '__main__':
        mutex=Lock()
        for i in range(10):
            p=Process(target=task,args=('路人%s' %i,mutex))
            p.start()
    '''
    打印结果:
    <路人0>查看剩余票数 [1]
    <路人4>查看剩余票数 [1]
    <路人1>查看剩余票数 [1]
    <路人2>查看剩余票数 [1]
    <路人5>查看剩余票数 [1]
    <路人3>查看剩余票数 [1]
    <路人8>查看剩余票数 [1]
    <路人6>查看剩余票数 [1]
    <路人7>查看剩余票数 [1]
    <路人9>查看剩余票数 [1]
    <路人0> 购票成功
    '''
    模拟抢票

    互斥锁和join的区别

    from multiprocessing import Process,Lock
    import json
    import time
    '''
    互斥锁:可以让局部代码串行
    join:只能让全部代码变成串行
    '''
    def search(name):
        time.sleep(1) # 模拟网络延迟
        dic = json.load(open('db.txt','r',encoding='utf-8'))
        print('<%s>查看剩余票数 [%s]' %(name, dic['count']))
    
    def get(name):
        time.sleep(1)
        dic = json.load(open('db.txt','r',encoding='utf-8'))
        if dic['count'] > 0:
            dic['count'] -= 1
            time.sleep(3)
            json.dump(dic,open('db.txt','w',encoding='utf-8'))
            print('<%s> 购票成功' %name)
        else:
            print('<%s> 购票失败' %name)
    
    def task(name,mutex):
        search(name)  # 并发的进行
        mutex.acquire()
        get(name)
        mutex.release()
    
    if __name__ == '__main__':
        mutex=Lock()
        for i in range(3):
            p = Process(target=task,args=('路人%s' %i,mutex))
            p.start()
            p.join()
    '''
    join打印结果:
    <路人0>查看剩余票数 [1]
    <路人0> 购票成功
    <路人1>查看剩余票数 [0]
    <路人1> 购票失败
    <路人2>查看剩余票数 [0]
    <路人2> 购票失败
    
    互斥锁的打印结果:
    <路人1>查看剩余票数 [1]
    <路人0>查看剩余票数 [1]
    <路人2>查看剩余票数 [1]
    <路人1> 购票成功
    <路人0> 购票失败
    <路人2> 购票失败
    '''
  • 相关阅读:
    git创建、删除分支
    Git 基础
    python pillow
    phantomjs 下载
    python3安装PIL
    selenium打开chrome时,出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors""
    chrome driver 下载
    go 单进程并发
    go 内嵌对象类型
    go 多态
  • 原文地址:https://www.cnblogs.com/Mryang123/p/8894075.html
Copyright © 2020-2023  润新知