gpt4 book ai didi

IOLoop 的 Tornado 优雅关闭

转载 作者:行者123 更新时间:2023-12-03 22:28:34 81 4
gpt4 key购买 nike

我正在使用以下代码优雅地关闭我的 Tornado 应用程序(取自 https://gist.github.com/wonderbeyond/d38cd85243befe863cdde54b84505784 ):

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 中总是有项目列表 例如:
[<tornado.ioloop._Timeout object at 0x106b90408>, <tornado.ioloop._Timeout object at 0x106b904c8>, ...]
io_loop._timeouts中的项目是什么? ?我应该期望这是一个空列表还是我不停止我应该拥有的东西?

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

最佳答案

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

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

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

关于IOLoop 的 Tornado 优雅关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41310613/

81 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com