7

私はこのようなシナリオを持っています: セマフォを含むクラス要素のオブジェクトを作成しました。

import multiprocessing as mpr

class Element(object):
    def __init__(self):
        self.sem = mpr.Semaphore()
        self.xyz = 33

def fun( ch ):
    a = ch.recv()
    print( a[0] )
    print( a[1].xyz )
    a[1].xyz = 99
    print( a[1].xyz )


el = Element()

( pa , ch ) = mpr.Pipe()
proc = mpr.Process(target=fun , args=( ch, ) )

proc.start()
pa.send( [ "Hallo" , el ])

print( el.xyz )

proc.join()

このコードは次のエラーを返します。

  File "/usr/lib/python2.7/multiprocessing/forking.py", line 51, in assert_spawning
    ' through inheritance' % type(self).__name__
RuntimeError: Semaphore objects should only be shared between processes through inheritance

しかし、コードの宣言からセマフォを削除するとElement動作しますが、a[1].xyz に割り当てられた値は失われます。

次に、セフォアとマルチプロセッシングを介してオブジェクトの大きなコレクションを同期する必要があります。では、すべてのオブジェクトにセマフォを設定し、メイン オブジェクトへの参照のみを渡す方法はありますか?

import multiprocessing as mpr

class Element(object):
    def __init__(self):
        self.xyz = 33

def fun( ch ):
    a = ch.recv()
    print( a[0] )
    print( a[1].xyz )
    a[1].xyz = 99
    print( a[1].xyz )


el = Element()

( pa , ch ) = mpr.Pipe()
proc = mpr.Process(target=fun , args=( ch, ) )

proc.start()
pa.send( [ "Hallo" , el ])

print( el.xyz )

proc.join()

2 番目のバージョンではエラーは発生しませんが、割り当てられた値a[1].xyz = 99はメイン プロセスで失われます。

4

1 に答える 1

25

multiprocessingモジュールの仕組みを理解していないと思います。

パイプを介して何かを送信すると、サブプロセスで酸洗いされてから酸洗いされなくなります。これは、サブプロセスが実際に元のオブジェクトのコピーを持っていることを意味します! そのため、変更は「失われます」。セマフォを追加しても何も変わりません。

共有メモリにオブジェクトが必要な場合は、multiprocessing.Valueを使用する必要がありますが、これは任意の型を処理しません。おそらくmultiprocessing.Managerが探しているものです。

別の方法は、変更されたオブジェクトを提供するメイン プロセスに応答を送信することです。

于 2012-10-19T16:55:39.453 に答える