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()
posted @ 2015-01-09 20:00  CalvinChu  阅读(1904)  评论(0编辑  收藏  举报