Sharing object (class instance) using multiprocessing Managers

multiprocessing, multiprocessing-manager, python

Solution

You must join your processes to prevent main process exiting before child processes continue their execution. So add joins to your code:

 consumer.join()
 producer.join()

after you called `start()` methods of your processes.

Problem

I need to share an object and its methods between several processes in python. I am trying to use `managers` (in module `multiprocessing`) but it crashes. Here is a silly example of producer-consumer where the shared object between the two processes is just a list of numbers with four methods. ``` from multiprocessing import Process, Condition, Lock from multiprocessing.managers import BaseManager import time, os lock = Lock() waitC = Condition(lock) waitP = Condition(lock) class numeri(object): def __init__(self): self.nl = [] def getLen(self): return len(self.nl) def stampa(self): print self.nl def appendi(self, x): self.nl.append(x) def svuota(self): for i in range(len(self.nl)): del self.nl[0] class numManager(BaseManager): pass numManager.register('numeri', numeri, exposed = ['getLen', 'appendi', 'svuota', 'stampa']) def consume(waitC, waitP, listaNumeri): lock.acquire() if (listaNumeri.getLen() == 0): waitC.wait() listaNumeri.stampa() listaNumeri.svuota() waitP.notify() lock.release() def produce(waitC, waitP, listaNumeri): lock.acquire() if (listaNumeri.getLen() > 0): waitP.wait() for i in range(10): listaNumeri.appendi(i) waitC.notify() lock.release() def main(): mymanager = numManager() mymanager.start() listaNumeri = mymanager.numeri() producer = Process(target = produce, args =(waitC, waitP, listaNumeri,)) producer.start() time.sleep(2) consumer = Process(target = consume, args =(waitC, waitP, listaNumeri,)) consumer.start() main() ``` Anyway it always crashes like that, telling me this: ``` Process Process-3: Traceback (most recent call last): File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs) File "./trySemProc.py", line 61, in consume if (listaNumeri.getLen() == 0): File "<string>", line 2, in getLen File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod self._connect() File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect conn = self._Client(self._token.address, authkey=self._authkey) File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client c = SocketClient(address) File "/usr/lib/python2.7/multiprocessing/connection.py", line 293, in SocketClient s.connect(address) File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 2] No such file or directory ``` So what's the matter? How should I use these `managers` to share objects and their methods?

Original source