Python 服务优雅关闭

在 SIGTERM 时停止接新请求、排空进行中任务并关闭依赖,避免数据半写。

#type / concept #status / growing #tech / dev #resource / python #tech / lang / python

[!info] 关联笔记

Python 服务优雅关闭

这个概念为什么出现

容器/编排发送 SIGTERM 后若直接杀进程,会打断请求与事务。优雅关闭协议:

  1. 停止接新流量
  2. 等待进行中完成(有超时)
  3. 关闭连接与刷日志

[!abstract] 一句话理解 捕获终止信号,翻转“接受请求”开关,排空队列/连接后干净退出。

最小可运行示例

场景:工作循环响应停止标志

# graceful_flag_demo.py
# 业务意图:用 Event 模拟关闭开关。
# 教学点:协作式退出;真实服务接 signal。

from threading import Event


def worker_loop(stop: Event, max_steps: int = 3) -> int:
    steps = 0
    while not stop.is_set() and steps < max_steps:
        steps += 1
    return steps


def main() -> None:
    stop = Event()
    stop.set()  # 模拟收到关闭
    print("steps:", worker_loop(stop))


if __name__ == "__main__":
    main()

建议运行:

python graceful_flag_demo.py

期望输出:

steps: 0

结合场景再看三个关注点

  1. 协作式:循环/任务必须检查标志或取消。
  2. 超时强杀 仍可能发生。
  3. DB 事务与消息确认语义要对齐。

核心概念与准确模型

  • SIGTERM/SIGINT
  • load balancer 摘流
  • asyncio 取消树
  • finally/上下文清理

边界情况与反直觉行为

  1. 多线程忽略信号(主线程处理)
  2. 卡死在阻塞 SDK
  3. 双重信号

常见误区

[!warning] 常见误区:只注册 signal 不排空 错误理解:打印 bye 即优雅。
正确模型:停止接流 + 等待 + 关依赖。

工程实践

  • readiness 与 liveness 分离
  • 关闭超时可配置
  • 演练 kill 场景

本节总结

优雅关闭是服务契约。信号只是扳机,排空才是内容。

自测题

  1. 优雅关闭三步?
  2. 为何需要超时?
参考答案
  1. 停新流量、排空、关资源。
  2. 防止卡死任务永远不退出。

延伸阅读与资料来源

资料类型支撑内容
signal文档信号
创建于 2026/7/15 更新于 2026/7/15