• 进程互斥锁


    进程互斥锁

    进程同步(multiprocess.Lock) 锁——multiprocess.Lock
    	进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的。
    	而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
    
    # 多进程模拟抢票实例
    # 文件db内容为: {"count":1}
    # 注意一定要用双引号,不然json无法识别
    from multiprocessing import Process,Lock
    import time,json,random
    
    def search():
        dic = json.load(open('db'))
        print('剩余票数: %s'%dic['count'])
    
    def get():
        dic = json.load(open('db'))
        time.sleep(1)
        if dic['count'] > 0:
            dic['count'] -= 1
            time.sleep(2)
            json.dump(dic, open('db', 'w'))
            print('购票成功')
    
    def task():
        search()
        get()
    
    if __name__ == '__main__':
        for i in range(10):  # 模拟10个客户端抢票
            p = Process(target=task)
            p.start()
    # 引发问题:数据写入错乱。
    
    # 互斥锁保证数据安全
    from multiprocessing import Process,Lock
    import time,json,random,time
    
    def search():
        dic = json.load(open('db'))
        print('剩余票数:%s'%dic['count'])
    
    def get():
        dic = json.load(open('db'))
        # 模拟读数据的网络延迟
        time.sleep(random.random())
        if dic['count'] > 0:
            dic['count'] -= 1
            # 模拟写数据的网络延迟
            time.sleep(random.random())
            json.dump(dic, open('db', 'w'))
            print('购票成功')
        else:
            print('购票失败')
    
    def task(lock):
        search()
        lock.acquire()
        get()
        lock.release()
    
    if __name__ == '__main__':
        lock = Lock()
        for i in range(10):
            p = Process(target=task, args=(lock,))
            p.start()
    

    总结:

    ​ 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

    千里之行,始于足下。
  • 相关阅读:
    isMemberOfClass和isKindOfClass的区别
    performSelector和respondsToSelector用法
    iOS:堆(heap)和栈(stack)的理解
    iOS 事件处理机制与图像渲染过程
    IOS总结 静变量static、全局变量extern、局部变量、实例变量
    创建mvc
    程序启动原理
    常用几个UITableView,UICollectionView  UIScrollView关键点
    代码初始化 故事板初始化 xib初始化总结
    UINavigationController  和 UITabBarController
  • 原文地址:https://www.cnblogs.com/jincoco/p/12935925.html
Copyright © 2020-2023  润新知