python的多处理中的共享变量

发布于 2021-01-29 19:32:20

第一个问题是Value和Manager()。Value有什么区别?

其次,是否可以不使用Value共享整数变量?下面是我的示例代码。我想要的是获取一个整数值而不是Value的字典。我所做的就是在此过程之后全部更改。有没有更简单的方法?

from multiprocessing import Process, Manager

def f(n):
    n.value += 1

if __name__ == '__main__':
    d = {}
    p = []

    for i in range(5):
        d[i] = Manager().Value('i',0)
        p.append(Process(target=f, args=(d[i],)))
        p[i].start()

    for q in p:
        q.join()

    for i in d:
        d[i] = d[i].value

    print d
关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用时,Value您会ctypes在共享内存中获得一个对象,默认情况下,该对象使用进行同步RLock。使用ManagerSynManager对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值被其他进程操纵。您可以使用同一管理器创建多个代理;无需在循环中创建新的经理:

    manager = Manager()
    for i in range(5):
        new_value = manager.Value('i', 0)
    

    Manager可以跨计算机共享,而Value仅限于一台计算机。
    Value会更快(运行下面的代码查看),所以我认为您应该使用它,除非您需要支持任意对象或通过网络访问它们。

    import time
    from multiprocessing import Process, Manager, Value
    
    def foo(data, name=''):
        print type(data), data.value, name
        data.value += 1
    
    if __name__ == "__main__":
        manager = Manager()
        x = manager.Value('i', 0)
        y = Value('i', 0)
    
        for i in range(5):
            Process(target=foo, args=(x, 'x')).start()
            Process(target=foo, args=(y, 'y')).start()
    
        print 'Before waiting: '
        print 'x = {0}'.format(x.value)
        print 'y = {0}'.format(y.value)
    
        time.sleep(5.0)
        print 'After waiting: '
        print 'x = {0}'.format(x.value)
        print 'y = {0}'.format(y.value)
    

    总结一下:

    1. 使用Manager创建多个共享对象,包括字典和列表。用于Manager在网络上的计算机之间共享数据。
    2. 使用ValueArray不需要在网络上共享信息并且输入的类型ctypes足以满足您的需求时使用。
    3. Value比快Manager

    警告

    顺便说一下,如果可能的话,应该避免跨进程/线程共享数据。上面的代码可能会按预期运行,但是会增加执行时间,foo而且事情会变得很奇怪。将以上内容与:

    def foo(data, name=''):
        print type(data), data.value, name
        for j in range(1000):
            data.value += 1
    

    您需要aLock才能使其正常工作。

    我对所有这些都不是特别了解,所以也许其他人会出现并提供更多见解。我想我会提供一个答案,因为这个问题没有引起注意。希望能有所帮助。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看