2016-12-24 138 views
5

的正常关机,我用下面的代码来关闭我的龙卷风应用优雅(从https://gist.github.com/wonderbeyond/d38cd85243befe863cdde54b84505784拍摄):龙卷风IOLoop

def sig_handler(servers, sig, frame): 
    io_loop = tornado.ioloop.IOLoop.instance() 

    def stop_loop(deadline): 
     now = time.time() 
     if now < deadline and (io_loop._callbacks or io_loop._timeouts): 
      logging.info('Waiting for next tick') 
      print("CALL BACKS") 
      print(io_loop._callbacks) 
      print("TIMEOUTS") 
      print(io_loop._timeouts) 
      io_loop.add_timeout(now + 1, stop_loop, deadline) 
     else: 
      io_loop.stop() 
      logging.info("Shutting down.") 

    def shutdown(): 
     logging.info("Stopping http servers") 

     # servers is a list of servers to stop 
     for s in servers: 
      s.stop() 

     logging.info("Will shutdown in %s seconds ...", 
        MAX_WAIT_SEC_BEFORE_SHUTDOWN) 
     stop_loop(time.time() + MAX_WAIT_SEC_BEFORE_SHUTDOWN) 

    logging.warning("Caught signal: %s", sig) 
    io_loop.add_callback_from_signal(shutdown) 

我设置MAX_WAIT_SEC_BEFORE_SHUTDOWN为10秒。即使在关闭http服务器之后,每次都需要10秒钟才能关闭服务器。我注意到,有总是在io_loop._timeouts列表E.g项目:

[<tornado.ioloop._Timeout object at 0x106b90408>, <tornado.ioloop._Timeout object at 0x106b904c8>, ...] 

什么是io_loop._timeouts的项目?我应该期望这是一个空的列表,还是我没有阻止我应该拥有的东西?

这个关机程序是否正常?任何人都可以建议其他代码

回答

2

停止龙卷风HTTPServer不会关闭所有现有连接,它只会阻止服务器接受新连接。有一个undocumented close_all_connections method,但它不区分空闲的连接和当前正在处理请求的连接,因此它不适合用于正常关闭。目前没有任何方法可以在所有连接闲置时关闭连接。

每个空闲连接都会在IOLoop上保持超时(如果连接闲置时间过长,连接将会关闭,但默认为一小时,将idle_connection_timeout=传递给HTTPServer构造函数以更改此设置)。此外,Tornado或其他库的其他功能也可能会造成超时(在Tornado本身中,curl_httpclientautoreload都会创建超时,并始终运行),因此通常不能假定暂停超时的数量将达到零。

一般来说,我建议只是无条件地等待MAX_WAIT_SEC_BEFORE_SHUTDOWN,而不是试图确定是否安全关闭更快。如果您确实想确定所有挂起操作何时完成,那么最好自己保留挂起操作的计数(无论您认为合适的“操作”的定义是什么),而不是试图从IOLoop的实现细节中推断出这一点。

+0

谢谢本,一如既往非常翔实的答案。干杯 –