如何在python中使用multiprocessing.Manager()数组

时间:2017-10-30 01:03:05

标签: python python-multiprocessing

我正在使用Python的多处理启动工作进程。我需要能够更新子进程中可以在父进程中看到的数组。我使用multiprocessing.Manager()来实现这一目标。

a = multiprocessing.Manager().Array('f', [0,0])
a
<ArrayProxy object, typeid 'Array' at 0x7f4e2b4eeda0>

a.value
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
AttributeError: 'ArrayProxy' object has no attribute 'value'

当我创建Value('f', 0.0)时,我可以这样操作。当我查看dir(a)时,我没有看到任何明显的函数或属性要调用,而python中的文档在这一点上非常模糊。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要在Array原子内更新多个值。

在这种情况下,我建议你:

a.acquire()  # Using its internal lock object
a[0] = ...   # Do what ever you want
a[1] = ...
a.release()

答案 1 :(得分:0)

aproxy对象

<ArrayProxy object, typeid 'Array' at 0x7f4e2b4eeda0>
  

代理是一个对象,它指的是(可能)在不同进程中生存的共享对象。据说共享对象是代理的指示对象。

代理对象真实对象之间的关系如下所示,在 multiprocessing / managers.py

SyncManager.register('Value', Value, ValueProxy)
SyncManager.register('Array', Array, ArrayProxy)

我们看到 ArrayProxy

支持的运算符
ArrayProxy = MakeProxyType('ArrayProxy', (
    '__len__', '__getitem__', '__setitem__', '__getslice__', '__setslice__'
    ))                  # XXX __getslice__ and __setslice__ unneeded in Py3.0

数组实际上是array.array(...)

Value(typecode, value)数组

不同
  

创建一个具有可写value属性的对象,并为其返回一个代理。

class ValueProxy(BaseProxy):
    _exposed_ = ('get', 'set')
    def get(self):
        return self._callmethod('get')
    def set(self, value):
        return self._callmethod('set', (value,))
    value = property(get, set)