zoukankan      html  css  js  c++  java
  • 数据共享Manager

    将数据设置成共享数据,一个进程修改了数据,另外一个进程就能就接受的被修改的数据。

    起50个进程让他们都去操作一个数据:

    from multiprocessing import Process, Manager
    
    def func(m):
        m['dic'] -= 1
    
    
    if __name__ == "__main__":
        m = Manager()
        dic = m.dict({'dic':100})
        p_list = []
        for i in range(50):
            p = Process(target=func, args=(dic,))
            p.start()
    
            p_list.append(p)
        for i in p_list:
            i.join()
    
        print(dic['dic'])

    多运行几次发现,结果有时是50,有时是53,有时是57等等。。。

    为什么会出现这个结果,因为一个88被一个进程拿到要去修改还没修改时被其他进程拿到,然后这个进程将数据修改成87并写入字典,另外一个进程也就改成87并写入字典,这就导致数据不安全,解决办法加锁就可以了。

    from multiprocessing import Process, Manager, Lock
    
    def func(m, lock):
        lock.acquire()
        m['dic'] -= 1
        lock.release()
    
    
    if __name__ == "__main__":
        lock = Lock()
        m = Manager()
        dic = m.dict({'dic':100})
        p_list = []
        for i in range(50):
            p = Process(target=func, args=(dic, lock))
            p.start()
    
            p_list.append(p)
        for i in p_list:
            i.join()
    
        print(dic['dic'])
  • 相关阅读:
    ASP.NET中的参数与特殊类型和特性
    ASP.NET MVC概述及第一个MVC程序
    ASP.NET系统对象
    WCF学习——WCF简介(三)
    WCF学习——构建一个简单的WCF应用(二)
    WCF学习——构建一个简单的WCF应用(一)
    注入技术--修改pe文件导入表进行注入
    内存
    I/O
    进程
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9833519.html
Copyright © 2011-2022 走看看