0

0

Python 服务优雅退出的处理流程

舞夢輝影

舞夢輝影

发布时间:2026-02-24 20:49:02

|

790人浏览过

|

来源于php中文网

原创

python进程收到sigterm不退出,主因是signal.signal被覆盖且handler未调用sys.exit(),或主线程阻塞在不可中断调用中,需注册正确handler、改用可中断等待、统一用threading.event通知退出,并显式清理子进程、线程、连接池等资源。

python 服务优雅退出的处理流程

Python 进程收到 SIGTERM 后不退出?检查 signal.signal 是否被覆盖

很多服务在容器或 systemd 下启动后,发 kill -15 没反应,本质是 Python 默认对 SIGTERM 的处理被意外替换了,或者新注册的 handler 里没调用 sys.exit() 或没触发退出逻辑。

  • Python 启动时默认把 SIGTERM 设为 SIG_DFL(系统默认行为),但一旦你显式调用 signal.signal(signal.SIGTERM, handler),就接管了它——而 handler 里如果只做日志、不终止主循环或没调用 os._exit()/sys.exit(),进程就会卡住
  • 常见于用了 geventasyncio 的服务:它们可能内部重装了 signal handler,且未透传给用户逻辑
  • 验证方式:在 handler 里加 print("got SIGTERM"),再 kill -15 $PID,看是否打印;不打印说明 handler 没注册上,打印了却不退出说明逻辑漏了退出动作

主线程阻塞在 time.sleep() 或 queue.get()?用可中断的等待替代

优雅退出的前提是主逻辑能及时响应退出信号。但 time.sleep(30)queue.get() 这类调用会无视信号,直到超时或有数据才返回,导致退出延迟长达几十秒。

  • time.sleep() 改成带循环的短间隔轮询:for _ in range(300): time.sleep(0.1); if exit_event.is_set(): break
  • queue.get() 改用 queue.get(timeout=1),并在捕获 queue.Empty 后检查退出标志
  • 使用 threading.Event(如 exit_event = threading.Event())统一通知各线程退出,比轮询信号更可靠
  • 注意:event.wait(timeout) 是安全的,会被信号中断并抛出 InterruptedError,可直接捕获后退出

asyncio.run() 启动的服务怎么接 SIGTERM?别依赖 asyncio 的默认行为

asyncio.run() 本身不处理信号,它只是运行一个 event loop 并等其关闭。SIGTERM 到来时,loop 不会自动 stop,协程也不会被 cancel,除非你手动干预。

生活同城信息网系统
生活同城信息网系统

fankuan8生活同城信息网系统 v1206采用主流的Asp+Access开发设计,网站美工设计方面更大气,漂亮!网站浏览器兼容性也比较好,网站功能方面的细节方面十分强大。 网站程序的几大特点: 1.全站页面实行了伪静态化,各类型网站服务器的伪静态文件都已近处理好了,无需自己再做伪静态出来。 2.网站前台开始使用了fankuan8独立开发的互助链系统,开始使用时,在网站底部点击链接根据提示马上

下载
  • 必须在 asyncio.run() 外层注册 signal handler,并在 handler 中调用 loop.stop()loop.create_task(shutdown())
  • 推荐模式:用 asyncio.get_running_loop() 获取当前 loop,在 shutdown 协程中 await 清理资源(如关闭 aiohttp.ClientSession、取消 pending task),再调用 loop.stop()
  • 避免在 shutdown 协程里用 time.sleep() 或同步阻塞调用;改用 await asyncio.sleep()
  • 若用 uvicornfastapi,它们已内置信号处理,但自定义后台任务仍需手动监听 asyncio.CancelledError

子进程、线程、连接池没清理干净?退出前必须显式 close/wait

“退出”不是 kill -9,而是释放所有持有资源。没关掉的数据库连接、没 join 的线程、没 terminate 的子进程,都会让服务假死或留下孤儿进程。

立即学习Python免费学习笔记(深入)”;

  • 数据库连接池(如 SQLAlchemy):调用 engine.dispose(),不是只 session.close()
  • 线程:设好 daemon=False 的线程必须 join(timeout=5),超时后考虑 thread.ident 是否还存活
  • 子进程:用 subprocess.Popen 启动的,要 proc.terminate() + proc.wait(timeout=3),失败则 proc.kill()
  • 文件句柄、socket、临时文件:确保用 with 或显式 .close();临时目录可用 atexit.register(shutil.rmtree, path) 做兜底

最常被忽略的是异步资源的生命周期管理——比如一个 background task 在 loop 关闭后还在跑,它持有的连接或锁可能永远得不到释放。退出流程里没有「等待所有非守护协程结束」这一步,就得靠你自己追踪和 cancel。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

225

2026.02.06

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

13

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

829

2023.08.22

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

330

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

773

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号