• 进程互斥锁


    进程互斥锁

    进程同步(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()
    

    总结:

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

    千里之行,始于足下。
  • 相关阅读:
    vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
    vue-注册全局过滤器
    vue-nuxt--切换布局文件
    vue.js 分页加载,向上滑动,依次加载数据。
    Vue.js项目引入less文件报错解决
    小程序/js监听输入框验证金额
    React 安装
    类垂直站点插件实现与分享
    多维度论怎样在日常中提升
    node.js的安装环境搭建
  • 原文地址:https://www.cnblogs.com/jincoco/p/12935925.html
Copyright © 2020-2023  润新知