首页 > 代码库 > tornado 信号处理

tornado 信号处理

一般情况下,对于线上的程序,我们是不能采取kill -9 来杀掉进程的

因为程序可能有未处理完的程序,如果贸然采取kill -9可能会导致数据不一致

如果需要关闭程序怎么办呢,一般情况下我们采取信号技术
当我们按ctrl+c时程序会收到SIGINT信号
当发送kill pid指令时程序会收到SIGTERM信号

程序在收到这些信号后,我们需要做个处理,比如关闭监听端口不再接收新请求
然后等待60秒(等待时间根据自己的需要)用于未完成的处理。
等待结束后再关闭程序

我们以tornado为例,示例代码如下:

123456789101112131415161718192021222324252627282930
def sig_handler(sig, frame):    logging.warning(‘Caught signal: %s‘, sig)    tornado.ioloop.IOLoop.instance().add_callback(shutdown) def shutdown():    logging.info(‘Stopping http server‘)    http_server.stop()     logging.info(‘Will Shutdown in %s seconds ...‘, 60)    io_loop = tornado.ioloop.IOLoop.instance()     deadline = time.time() + 60      def stop_loop():        now = time.time()        if now < deadline and (io_loop._callbacks or io_loop._timeouts):            io_loop.add_timeout(now + 1, stop_loop)        else:            io_loop.stop()            logging.info(‘Shutdown‘)    stop_loop() if __name__ == "__main__":    tornado.options.parse_command_line()    http_server = tornado.httpserver.HTTPServer(Application())    http_server.listen(options.port)    logging.info(‘start listen on port: %s‘, options.port)    signal.signal(signal.SIGTERM, sig_handler)    signal.signal(signal.SIGINT, sig_handler)    tornado.ioloop.IOLoop.instance().start()

tornado 信号处理