2013-06-14 5 views
12

मैं टर्ननाडो वेब सर्वर के लिए नया हूँ। जब मैं python main_tornado.py का उपयोग कर टर्ननाडो वेब सर्वर शुरू करता हूं यह काम कर रहा है। कृपया नीचे कोड देखें।ctrl + c के साथ टर्ननाडो वेब सर्वर को कैसे रोकें?

import tornado.ioloop 
import tornado.web 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

जब मैं CTRL + C का उपयोग कर सर्वर को रोकता हूं तो यह निम्न त्रुटि देता है।

^CTraceback (most recent call last): 
    File "main_tornado.py", line 19, in <module> 
    tornado.ioloop.IOLoop.instance().start() 
    File "/home/nyros/Desktop/NewWeb/venv/lib/python3.2/site-packages/tornado/ioloop.py", line 301, in start 
    event_pairs = self._impl.poll(poll_timeout) 
KeyboardInterrupt 

कृपया मेरी समस्या का समाधान करें। धन्यवाद ..

+0

[मैं तूफान वेब सर्वर को कैसे रोकूं?] इस (http://stackoverflow.com/questions/5375220/how-do-i-stop-tornado-web-server) – Blender

+0

क्यों है के संभावित डुप्लिकेट एक समस्या? –

उत्तर

21

आप tornado.ioloop.IOLoop.instance().stop() के साथ टोरनाडो मुख्य पाश को रोक सकते हैं। इस विधि के साथ Ctrl + सी संकेत पास करने के बाद कहा जाता है करने के लिए आप समय-समय पर वैश्विक ध्वज जांच कर सकते हैं परीक्षण करने के लिए करता है, तो मुख्य पाश खत्म होना चाहिए और रजिस्टर जो इस ध्वज का मान बदल जाएगा SIGINT संकेत के लिए हैंडलर:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import tornado.ioloop 
import tornado.web 
import signal 
import logging 
from tornado.options import options 

is_closing = False 

def signal_handler(signum, frame): 
    global is_closing 
    logging.info('exiting...') 
    is_closing = True 

def try_exit(): 
    global is_closing 
    if is_closing: 
     # clean up here 
     tornado.ioloop.IOLoop.instance().stop() 
     logging.info('exit success') 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    tornado.options.parse_command_line() 
    signal.signal(signal.SIGINT, signal_handler) 
    application.listen(8888) 
    tornado.ioloop.PeriodicCallback(try_exit, 100).start() 
    tornado.ioloop.IOLoop.instance().start() 

आउटपुट:

$ python test.py 
[I 130614 11:19:19 web:1514] 200 GET/(127.0.0.1) 0.56ms 
^C[I 130614 11:19:21 test:14] exiting... 
[I 130614 11:19:21 test:22] exit success 

अद्यतन

मैं सिर्फ सवाल Tornado long polling requests में इस सरल समाधान देखा है:

try: 
    tornado.ioloop.IOLoop.instance().start() 
except KeyboardInterrupt: 
    tornado.ioloop.IOLoop.instance().stop() 

जाहिर है, यह एक कम सुरक्षित तरीका है।

+0

उत्तर के लिए धन्यवाद। आपका कोड सही है। मैं टर्ननाडो httpserver का उपयोग कर रहा हूं। जब मैं ctrl + c दबाता हूं तो सर्वर को मारने में लंबा समय लगता है। कोई विचार। – dhana

+0

आपके पास शायद कुछ अवरुद्ध कार्य है जिसे 'try_exit()' कॉलबैक कहा जाता है इससे पहले पहले समाप्त होना होगा। आप 'tornado.ioloop.IOLoop.instance() का उपयोग करने का प्रयास कर सकते हैं। सीधे सिग्नल हैंडलर में रोकें()' लेकिन यह मेरे लिए बहुत कम सुरक्षित लगता है। यदि आप प्रोसेसिंग के बीच में क्रूरता से अनंत लूप को तोड़ना चाहते हैं तो त्रुटि संदेशों से बचना मुश्किल होगा। – Nykakin

+0

मूल समाधान (हैंडलिंग सिग्नल। एसआईजीआईएनटी) विंडोज़ पर मेरे लिए बहुत अच्छा काम करता है, लेकिन आपके उत्तर में "अपडेट" (बस कीबोर्ड इंटरप्ट को पकड़ना) नहीं करता है। विंडोज़ पर Ctrl + C कीबोर्ड इंटरप्ट उत्पन्न नहीं करेगा और कुछ लोग (जैसे मेरे कॉम्पैक्ट कीबोर्ड के साथ) उनके कीबोर्ड पर CTRL + पॉज़ ब्रेक नहीं है। –

2

कोड ठीक है। CTRL + C कीबोर्ड इंटरप्ट उत्पन्न करता है। सर्वर को रोकने के लिए आप CTRL + C के बजाय CTRL + पॉज़ ब्रेक (विंडोज़ पर) का उपयोग कर सकते हैं। लिनक्स पर CTRL + C भी कीबोर्ड इंटरप्ट उत्पन्न करता है। यदि आप CTRL + Z प्रोग्राम का उपयोग करेंगे, तो बंद हो जाएगा लेकिन बंदरगाह व्यस्त हो जाएगा।

+0

जब आप 'CTRL + C'' के बजाय 'CTRL + 'कहते हैं, तो क्या आप वास्तव में नियंत्रण और' प्लस 'कुंजी का मतलब रखते हैं? क्योंकि यह मेरे लिए कुछ भी नहीं करता – puk

+0

क्षमा करें, मैंने वहां अपने बयान संपादित किए हैं। –

+1

'CTRL + Z' इसे रोक नहीं पाएगा, लेकिन बस प्रक्रिया को पृष्ठभूमि में ले जाएं। – WhyNotHugo

4

आप सिग्नल हैंडलर से टोरनाडो ioloop को बस रोक सकते हैं। यह add_callback_from_signal() विधि के लिए सुरक्षित होना चाहिए, इवेंट लूप अच्छी तरह से बाहर निकल जाएगा, अंततः एक साथ चल रहे कार्य को खत्म कर देगा।

import tornado.ioloop 
import tornado.web 
import signal 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

def sig_exit(signum, frame): 
    tornado.ioloop.IOLoop.instance().add_callback_from_signal(do_stop) 

def do_stop(signum, frame): 
    tornado.ioloop.IOLoop.instance().stop() 

if __name__ == "__main__": 
    application.listen(8888) 
    signal.signal(signal.SIGINT, sig_exit) 
    tornado.ioloop.IOLoop.instance().start() 
+3

यह वास्तव में हर जगह प्रदूषण ग्लोबल्स के बजाय स्वीकृत उत्तर होना चाहिए। – cowbert

+0

स्पष्ट रूप से 'do_stop' को परिभाषित करने के बजाय 'lambda' का उपयोग न करने का कोई कारण नहीं है? – cowbert

+0

do_stop() को अन्य स्थानों से भी बुलाया जा सकता है। लेकिन वास्तव में, यह लैम्ब्डा हो सकता है। –

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