zoukankan      html  css  js  c++  java
  • 并发编程---互斥锁---互斥锁与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> 购票失败
    '''
  • 相关阅读:
    转:win2000/2003 Discuz生存环境搭建及基础优化
    http://db.grussell.org 测试答案 1
    转:linux系统的主机做代理服务器
    C# code 0002
    Welcome to .NET BY C#
    几篇关于Visual Studio Team Foundation Server (TFS) 安装的文章
    VS2003不知道怎么不能编译C文件
    Kaspersky 更新修复
    入行性能测试两个月
    WMI 注册表 StdRegProv
  • 原文地址:https://www.cnblogs.com/Mryang123/p/8894075.html
Copyright © 2011-2022 走看看