python Multiprocessing BaseManager registrierte Klasse verlor die Verbindung sofort nach Strg-C

Ich habe einige Probleme, von denen ich vermute, dass sie eine Einschränkung meines Python-Programms sind. Mein Programm konnte die Methoden einer registrierten BaseManager-Klasse nicht sofort aufrufen, nachdem ich Strg-C gedrückt habe, selbst wenn andere Prozesse als Klassen implementiert wurden erben von Multiprocessing.Process sind betroffen. Ich möchte einige Methoden aus einem Prozess aufrufen, die nach Strg-C nicht korrekt ausgeführt werden.

Zum Beispiel kann der folgende Code die mt-Instanz von TestClass nach Strg-C nicht aufrufen.

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 t.a
    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 <module>
    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

Hast du irgendwelche Vorschläge? Gibt es eine Problemumgehung oder etwas falsches in meinem Code?

Danke im Voraus

Antworten auf die Frage(4)

Ihre Antwort auf die Frage