tornado 信号处理
一般情况下,对于线上的程序,我们是不能采取kill -9 来杀掉进程的
因为程序可能有未处理完的程序,如果贸然采取kill -9可能会导致数据不一致
如果需要关闭程序怎么办呢,一般情况下我们采取信号技术
当我们按ctrl+c时程序会收到SIGINT信号
当发送kill pid指令时程序会收到SIGTERM信号
程序在收到这些信号后,我们需要做个处理,比如关闭监听端口不再接收新请求
然后等待60秒(等待时间根据自己的需要)用于未完成的处理。
等待结束后再关闭程序
我们以tornado为例,示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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() |