zoukankan      html  css  js  c++  java
  • 进程互斥锁

    进程互斥锁

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

    总结:

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

    千里之行,始于足下。
  • 相关阅读:
    input标签上传文件处理。
    Radio单选框元素操作。
    CompletableFuture方法
    传播学 2
    传播学 1
    0
    紅軍不怕遠征難
    ~~~~~~~~~
    什么是企业战略
    论述提供公共咨询服务的两种主要方式。
  • 原文地址:https://www.cnblogs.com/jincoco/p/12935925.html
Copyright © 2011-2022 走看看