La clase registrada de BaseManager multiproceso de Python perdió la conexión inmediatamente después de Ctrl-C

Estoy experimentando algunos problemas que sospecho que es una limitación de mi progtwig Python para manejarlos correctamente, mi progtwig no ha podido llamar a los métodos de una clase registrada de BaseManager inmediatamente después de que presioné Ctrl-C, incluso otro proceso implementado como clases que heredan De multiprocesamiento. El proceso se ve afectado. Tengo algunos métodos a los que me gustaría llamar desde un proceso que no se ejecuta correctamente después de Ctrl-C.

Por ejemplo, el siguiente código no puede llamar a la instancia mt de TestClass después de Ctrl-C.

from multiprocessing.managers import BaseManager, NamespaceProxy import time class TestClass(object): def __init__(self, a): self.a = a def b(self): print self.a class MyManager(BaseManager): pass class TestProxy(NamespaceProxy): # We need to expose the same __dunder__ methods as NamespaceProxy, # in addition to the b method. _exposed_ = ('__getattribute__', '__setattr__', '__delattr__', 'b') def b(self): callmethod = object.__getattribute__(self, '_callmethod') return callmethod('b') MyManager.register('TestClass', TestClass, TestProxy) if __name__ == '__main__': manager = MyManager() manager.start() t = TestClass(1) print ta mt = manager.TestClass(2) print mt.a mt.a = 5 mt.b() try: while 1: pass except (KeyboardInterrupt, SystemExit): time.sleep(0.1) mt.a = 7 mt.b() print "bye" pass Here is the console output 1 2 5 ^CTraceback (most recent call last): File "testManager.py", line 38, in  mt.a = 7 File "/usr/lib/python2.7/multiprocessing/managers.py", line 1028, in __setattr__ return callmethod('__setattr__', (key, value)) File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod conn.send((self._id, methodname, args, kwds)) IOError: [Errno 32] Broken pipe 

¿Tienes alguna sugerencia? ¿Hay alguna solución o algo malo en mi código?

Gracias por adelantado.

Esto es un duplicado de la pregunta y escribí allí:

La solución más simple: iniciar el administrador con

 manager.start(signal.signal, (signal.SIGINT, signal.SIG_IGN)) 

en lugar de manager.start (). Y verifique si el módulo de señal está en sus importaciones (señal de importación).

Esta captura e ignora SIGINT (Ctrl-C) en el proceso de gestión.

Si alguien tiene este problema, lo resolví en base a esta respuesta https://stackoverflow.com/a/21106459/1667319 . Aquí está el código de trabajo

 from multiprocessing.managers import SyncManager, NamespaceProxy import time import signal #handle SIGINT from SyncManager object def mgr_sig_handler(signal, frame): print 'not closing the mgr' #initilizer for SyncManager def mgr_init(): signal.signal(signal.SIGINT, mgr_sig_handler) #signal.signal(signal.SIGINT, signal.SIG_IGN) # <- OR do this to just ignore the signal print 'initialized mananger' class TestClass(object): def __init__(self, a): self.a = a def b(self): print self.a class MyManager(SyncManager): pass class TestProxy(NamespaceProxy): # We need to expose the same __dunder__ methods as NamespaceProxy, # in addition to the b method. _exposed_ = ('__getattribute__', '__setattr__', '__delattr__', 'b') def b(self): callmethod = object.__getattribute__(self, '_callmethod') return callmethod('b') MyManager.register('TestClass', TestClass, TestProxy) if __name__ == '__main__': manager = MyManager() manager.start(mgr_init) t = TestClass(1) print ta mt = manager.TestClass(2) print mt.a mt.a = 5 mt.b() try: while 1: pass except (KeyboardInterrupt, SystemExit): time.sleep(0.1) mt.a = 7 mt.b() print "bye" pass 

Aclamaciones,