码迷,mamicode.com
首页 > 其他好文 > 详细

tornado 信号处理

时间:2015-01-09 20:56:51      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

一般情况下,对于线上的程序,我们是不能采取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()

tornado 信号处理

标签:

原文地址:http://www.cnblogs.com/apexchu/p/4214091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!