繁体   English   中英

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

[英]How to work with a multiprocessing.Manager() Array in python

我正在使用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中的文档对此真的很模糊。

如果我对您的理解正确,则需要以原子方式更新Array多个值。

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

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

a代理对象

<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属性的对象,并为其返回代理。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM