Multiprocessing Pythona, przekazując referencję do obiektu zawierającą semafor

Mam taki scenariusz: Stworzyłem obiekt elementu klasy zawierający semafor.

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()

Ten kod zwraca ten błąd:

  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

Ale jeśli usunę semafor z deklaracjiElement kod działa, ale wartość przypisana do [1] .xyz zostanie utracona.

Teraz potrzebuję zsynchronizować dużą kolekcję obiektów poprzez semphore i multiprocessing. Więc jest jakaś metoda ustawiania semafora w każdym obiekcie i przekazywania tylko odniesienia do głównego obiektu?

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()

Druga wersja nie powoduje żadnego błędu, ale wartość przypisana doa[1].xyz = 99 zostanie utracony w głównym procesie.

questionAnswers(1)

yourAnswerToTheQuestion