私はこのようなシナリオを持っています: セマフォを含むクラス要素のオブジェクトを作成しました。
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
はメイン プロセスで失われます。