• 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()
  • 相关阅读:
    Kafka: Producer (0.10.0.0)
    Kafka:架构简介【转】
    ZooKeeper示例 分布式锁
    机器学习---人脸对齐的基于形状模型的训练
    人脸妆容迁移---研究和思考
    机器学习----人脸对齐的算法-ASM.AAM..CLM.SDM
    基于opencv+Dlib的面部合成(Face Morph)
    c语言编程-----指向二维数组的指针
    工具软件 PYUV打开raw图片
    eclipse 使用问题
  • 原文地址:https://www.cnblogs.com/apexchu/p/4214091.html
Copyright © 2020-2023  润新知