zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    iOS的一些面试题分析总结(1)
    iOS的一些面试题分析总结(0)
    iOS页面间传值的一些方式总结
    自定义UIButton
    iOS查看3D效果的手势交互
    关于php得到参数数据
    ios安装ipa与安卓安装apk
    听说程序员想当就能当?
    W5100S、W5500、W5100差异对比
    annot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-clean-plugin:maven
  • 原文地址:https://www.cnblogs.com/apexchu/p/4214091.html
Copyright © 2011-2022 走看看