2016-12-24 5 views
5

की सुंदर शटडाउन मैं निम्नलिखित कोड का उपयोग कर रहा शान (https://gist.github.com/wonderbeyond/d38cd85243befe863cdde54b84505784 से लिया गया) मेरी बवंडर आवेदन को बंद करने का:तूफान IOLoop

def sig_handler(servers, sig, frame): 
    io_loop = tornado.ioloop.IOLoop.instance() 

    def stop_loop(deadline): 
     now = time.time() 
     if now < deadline and (io_loop._callbacks or io_loop._timeouts): 
      logging.info('Waiting for next tick') 
      print("CALL BACKS") 
      print(io_loop._callbacks) 
      print("TIMEOUTS") 
      print(io_loop._timeouts) 
      io_loop.add_timeout(now + 1, stop_loop, deadline) 
     else: 
      io_loop.stop() 
      logging.info("Shutting down.") 

    def shutdown(): 
     logging.info("Stopping http servers") 

     # servers is a list of servers to stop 
     for s in servers: 
      s.stop() 

     logging.info("Will shutdown in %s seconds ...", 
        MAX_WAIT_SEC_BEFORE_SHUTDOWN) 
     stop_loop(time.time() + MAX_WAIT_SEC_BEFORE_SHUTDOWN) 

    logging.warning("Caught signal: %s", sig) 
    io_loop.add_callback_from_signal(shutdown) 

मैं 10 सेकंड के लिए MAX_WAIT_SEC_BEFORE_SHUTDOWN निर्धारित किया है। Http सर्वर को बंद करने के बाद भी सर्वर को बंद करने के लिए हर बार पूर्ण 10 सेकंड लगते हैं। मैं उल्लेख किया है वहाँ हमेशा io_loop._timeouts सूची उदा में आइटम हैं कि:

[<tornado.ioloop._Timeout object at 0x106b90408>, <tornado.ioloop._Timeout object at 0x106b904c8>, ...] 

क्या io_loop._timeouts में आइटम हैं? क्या मुझे उम्मीद है कि यह एक खाली सूची होगी या क्या मैं कुछ ऐसा नहीं रोक रहा हूं जो मेरे पास होना चाहिए?

क्या यह शट डाउन नियमित सामान्य है? क्या कोई अन्य कोड सुझा सकता है?

उत्तर

2

टोरनाडो HTTPServer को रोकना सभी मौजूदा कनेक्शन बंद नहीं करता है, यह केवल सर्वर को नए स्वीकार करने से रोकता है। एक undocumented close_all_connections method है, लेकिन यह निष्क्रिय कनेक्शन के बीच अंतर नहीं करता है और जो वर्तमान में अनुरोध संसाधित कर रहे हैं, इसलिए यह एक सुंदर शटडाउन में उपयोग के लिए उपयुक्त नहीं है। वर्तमान में निष्क्रिय होने के कारण सभी कनेक्शन बंद करने का कोई तरीका नहीं है।

प्रत्येक निष्क्रिय कनेक्शन (, अगर यह बहुत लंबे समय के लिए निष्क्रिय होने कनेक्शन बंद कर दिया जाएगा, हालांकि इस के लिए डिफ़ॉल्ट एक घंटा है। HTTPServer निर्माता को idle_connection_timeout= दर्रा इसे बदलने के लिए) IOLoop पर एक टाइमआउट बनाए रखता है। इसके अलावा, टॉरनाडो या अन्य पुस्तकालयों की अन्य विशेषताएं भी समय-समय पर (टॉरनाडो में, curl_httpclient और autoreload दोनों समय-समय पर चलने वाले टाइमआउट बना सकती हैं), इसलिए आप सामान्य रूप से यह नहीं मान सकते कि लंबित टाइमआउट की संख्या शून्य तक पहुंच जाएगी।

सामान्य रूप से, मैं यह निर्धारित करने की कोशिश करने के बजाय MAX_WAIT_SEC_BEFORE_SHUTDOWN के लिए बिना शर्त रूप से प्रतीक्षा करने की अनुशंसा करता हूं कि यह जल्द से जल्द बंद होना सुरक्षित है या नहीं। यदि आप यह निर्धारित करना चाहते हैं कि सभी लंबित परिचालन कब समाप्त हो गए हैं, तो IOLoop के कार्यान्वयन विवरण से इसका अनुमान लगाने की कोशिश करने के बजाय लंबित परिचालनों की गणना करना ("ऑपरेशन" की उचित परिभाषा के लिए) को रखना सर्वोत्तम है।

+0

धन्यवाद बेन, हमेशा एक बहुत ही जानकारीपूर्ण उत्तर के रूप में। चियर्स –

संबंधित मुद्दे