2017-06-26 4 views
0

Warum Strg + C Server nicht stoppen, auf Windows?Warum Ctrl C nicht Tornado-Server stoppen

dieser Code nicht ausgeführt print 'get sig:%d' % signum

import signal 

import tornado 
import tornado.web 
import tornado.httpserver 


class DefaultHandler(tornado.web.RequestHandler): 

    def get(self): 
     self.set_status(200, 'OK') 
     self.write('hello guest') 

    def post(self): 
     self.get() 


class Receiver(object): 

    def __init__(self, address=None, port=8100, gzip=False): 

     if not address: 
      address = '0.0.0.0' 
     self.address = address 
     self.port = port 
     self.gzip = gzip 
     self.http_server = None 

    def start(self): 
     settings = dict(
     ) 
     application = tornado.web.Application([ 
      (r"/", DefaultHandler),], 
      **settings) 
     self.http_server = tornado.httpserver.HTTPServer(application, decompress_request=self.gzip) 
     self.http_server.listen(self.port) 
     tornado.ioloop.IOLoop.instance().start() 

    def shutdown(self): 

     if self.http_server is not None: 
      self.http_server.stop() 
     tornado.ioloop.IOLoop.instance().stop() 


if __name__ == '__main__': 
    receiver = Receiver(port=8901) 

    def sig_handler(signum, frame): 
     print 'get sig:%d' % signum 
     receiver.shutdown() 


    signal.signal(signal.SIGTERM, sig_handler) 
    signal.signal(signal.SIGINT, sig_handler) 
    receiver.start() 

nur Hauptthread kann Signal, Griff so verwenden Gewindeaufnehmer zu starten und Hauptthread lassen Sie einige gefälschte Arbeit am Leben zu halten threading.Thread(target=receiver.start).start() while 1: try: time.sleep(2) except: break

+0

https://stackoverflow.com/a/800559/1925257 See. – xyres

Antwort

1

Signalhandler sind eine spezielle Umgebung. Sie müssen vorsichtig sein, was Sie in einem tun, weil Sie den Zustand der Funktionen nicht kennen, die durch das Signal unterbrochen wurden. In Tornado, nur eine Funktion ist garantiert sicher aus einem Signal-Handler aufrufen: IOLoop.add_callback_from_signal. Stattdessen shutdown() direkt aufzurufen, verwenden Sie add_callback_from_signal es zu planen:

def sig_handler(signum, frame): 
    IOLoop.current().add_callback_from_signal(receiver.shutdown) 
Verwandte Themen