python - अजगर बहुप्रोसेसिंग बेसमैनेजर पंजीकृत वर्ग तुरंत Ctrl-C के बाद कनेक्शन खो गया




process multiprocessing (2)

अगर किसी को इस मुद्दे पर होता है, तो मैंने इस उत्तर के आधार पर हल किया https://stackoverflow.com/a/21106459/1667319 यहां काम कर रहे कोड है

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

चीयर्स,

मुझे कुछ ऐसे मुद्दों का सामना करना पड़ रहा है जिनके बारे में मुझे संदेह है कि मेरे अजगर प्रोग्राम को सही ढंग से संभालने की सीमा है, मेरे प्रोग्राम को सीधा-सी के तुरंत बाद एक पंजीकृत क्लास के बेसमैनेजर के तरीकों को कॉल करने में सक्षम नहीं है, यहां तक ​​कि अन्य प्रक्रियाएं जो कक्षाओं के रूप में लागू होती हैं प्रसंस्करण से प्रभावित होते हैं। मेरे पास कुछ विधियां हैं जो मैं प्रक्रिया से कॉल करना चाहूंगा जो सही ढंग से सीपीयू-सी के बाद निष्पादित नहीं होती हैं

उदाहरण के लिए निम्न कोड 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 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

क्या आपके पास कोई सुझाव है? क्या मेरे कोड में कोई समस्या है या कुछ गलत है?

अग्रिम में धन्यवाद।


यह प्रश्न का डुप्लिकेट है और मैंने वहां लिखा था:

सरल समाधान - शुरुआत प्रबंधक के साथ

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

manager.start () के बजाय और जांचें कि क्या संकेत मॉड्यूल आपके आयात में है (आयात संकेत)

यह मैनेजर प्रक्रिया में SIGINT (Ctrl-C) को पकड़ और अनदेखा करता है





keyboardinterrupt