Python 服务优雅关闭
在 SIGTERM 时停止接新请求、排空进行中任务并关闭依赖,避免数据半写。
#type / concept
#status / growing
#tech / dev
#resource / python
#tech / lang / python
[!info] 关联笔记
Python 服务优雅关闭
这个概念为什么出现
容器/编排发送 SIGTERM 后若直接杀进程,会打断请求与事务。优雅关闭协议:
- 停止接新流量
- 等待进行中完成(有超时)
- 关闭连接与刷日志
[!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
结合场景再看三个关注点
- 协作式:循环/任务必须检查标志或取消。
- 超时强杀 仍可能发生。
- DB 事务与消息确认语义要对齐。
核心概念与准确模型
- SIGTERM/SIGINT
- load balancer 摘流
- asyncio 取消树
- finally/上下文清理
边界情况与反直觉行为
- 多线程忽略信号(主线程处理)
- 卡死在阻塞 SDK
- 双重信号
常见误区
[!warning] 常见误区:只注册 signal 不排空 错误理解:打印 bye 即优雅。
正确模型:停止接流 + 等待 + 关依赖。
工程实践
- readiness 与 liveness 分离
- 关闭超时可配置
- 演练 kill 场景
本节总结
优雅关闭是服务契约。信号只是扳机,排空才是内容。
自测题
- 优雅关闭三步?
- 为何需要超时?
参考答案
- 停新流量、排空、关资源。
- 防止卡死任务永远不退出。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| signal | 文档 | 信号 |