2017-10-30 1 views
0

私はPythonのマルチプロセッシングを使用してワーカープロセスを起動します。親プロセスで見ることができるサブプロセス内の配列を更新できるようにする必要があります。私はそれを達成するためにmultiprocessing.Manager()を使用します。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のドキュメントは実際にはあいまいです。

+0

通常 'array.array'オブジェクトのいずれか、' .value'属性を持っていません。それには何が含まれると思いますか? – larsks

+0

***あなたは実際に*** ArrayProxyオブジェクトを更新しようとしましたか?それはあなたがここでやっているようなものではないようです。 – Abdou

+0

私はそれを他のプロセスに渡しました。私はそれを印刷して値を見ることができ、私は[i]を使って各値にアクセスできることが分かりました。だから私はそれが実際にサブプロセスの配列の値を更新する唯一の方法だと思います。私は、各要素を反復して更新するのではなく、アトミック操作でもない、1つのステップで配列全体を設定できることを期待していました。私の目標は、単純にサブプロセスの配列の値を親プロセスで表示できる原子的な方法で更新することです。妥当な期待は 'a.set_value([1.0,2.0])'のようです。 –

答えて

0

私が正しく理解していれば、Arrayの中に複数の値をアトミックに更新する必要があります。この場合

は、私はあなたをお勧め:

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

あるいは 'a [:] = [1,2,3]'のようなことができます。 – Sraw

0

aproxyオブジェクト

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

プロキシは、(おそらく)住んでいる共有オブジェクトを参照するオブジェクトであるに別のプロセス。共有オブジェクトは、プロキシの参照先と呼ばれます。

マルチプロセッシング/ 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) 
関連する問題