2017-06-26 57 views
0

爲什麼ctrl + c不停止服務器,在Windows上?爲什麼ctrl c不停止龍捲風服務器

不執行該代碼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() 

只有主線程可以處理信號,所以使用線程開始接收器,讓主線程做一些假的工作永葆 threading.Thread(target=receiver.start).start() while 1: try: time.sleep(2) except: break

+0

見https://stackoverflow.com/a/800559/1925257。 – xyres

回答

1

信號處理程序是一個特殊的環境。你必須小心你在一箇中做什麼,因爲你不知道被信號中斷的功能的狀態。在龍捲風中,只有一個函數保證可以安全地從一個信號處理函數裏調用:IOLoop.add_callback_from_signal。而不是直接調用shutdown()的,使用add_callback_from_signal安排吧:

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