Python如何优雅地关闭Web服务_使用信号处理实现平滑重启

轻涛酱_8488

轻涛酱_8488

2026-04-02

363人浏览

原创

Python Web服务不能直接Ctrl+C终止,因SIGINT会中断正在处理的请求导致连接重置、事务未提交;平滑关闭需服务器支持(如uvicorn/gunicorn)且应用层配合,等待活跃请求完成后再退出。

python如何优雅地关闭web服务_使用信号处理实现平滑重启

Python Web服务为什么不能直接用 Ctrl+C 就完事

Ctrl+C 发送的是 SIGINT,它会立刻中断主线程,正在处理的 HTTP 请求可能被砍在中间——连接重置、响应不全、数据库事务没提交,用户看到 502 或白屏。这不是“关服务”,是“砸服务器”。平滑关闭的核心不是“快”,而是“等正在干活的请求干完再走”。

关键前提是:Web 服务器得支持优雅关闭(比如 uvicorn、gunicorn、原生 http.server 都行,但实现方式不同);应用层也得配合,比如别让长轮询或后台线程卡住主进程。

uvicorn 怎么加信号处理实现平滑退出

uvicorn 默认已内置对 SIGTERM 和 SIGINT 的响应,但只在它自己管理生命周期时生效。如果你用 uvicorn.run() 启动,直接按 Ctrl+C 就能触发 graceful shutdown——前提是没手动捕获并忽略信号,也没用 threading.Thread(daemon=True) 跑着没结束的后台任务。

  • 别在代码里写 signal.signal(signal.SIGINT, lambda *a: sys.exit(0)),这会覆盖 uvicorn 自己的处理逻辑
  • 如果用 uvicorn.Server 类手动启动(比如嵌入到其他程序),必须显式调用 server.shutdown(),且要确保在事件循环中执行(用 asyncio.create_task(server.shutdown()))
  • 检查日志里有没有 Shutting down 和 Waiting for application shutdown —— 没这两句说明根本没进优雅流程

示例:正确嵌入式用法

import asyncio
import uvicorn
<p>config = uvicorn.Config("app:app", host="0.0.0.0", port=8000)
server = uvicorn.Server(config)</p><p>async def main():
await server.serve()</p><p>if <strong>name</strong> == "<strong>main</strong>":
asyncio.run(main())</p>

gunicorn 如何配置才能真正平滑重启

gunicorn 的优雅关闭依赖两个参数:--graceful-timeout(等 worker 多久)和 --timeout(单个请求最长容忍时间)。很多人只设了 --timeout,结果 reload 时旧 worker 立刻被 kill,根本没机会收尾。

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载
  • --graceful-timeout 30 表示发 SIGTERM 后,最多等 30 秒让 worker 主动退出;超时就强制杀
  • --timeout 120 是单个请求最大执行时间,和 graceful 无关,别混淆
  • 用 gunicorn --reload 开发时,它会用 SIGHUP 触发 reload,但默认不等待旧 worker 结束——必须加 --preload 或确保应用本身处理了 SIGHUP
  • 生产环境推荐用 systemctl reload gunicorn.service,靠 systemd 的 KillMode=mixed + TimeoutStopSec=45 配合 gunicorn 的 --graceful-timeout

自己写的 http.server 怎么加信号支持

Python 标准库的 http.server.HTTPServer 本身不响应信号,得手动加。核心是:收到 SIGTERM 后,停止接受新连接,等已有请求处理完,再退出。

  • 用 server.shutdown() 停止监听,但它不会等活跃请求——得自己维护一个请求计数器(比如用 threading.Semaphore 或原子变量)
  • 在每个请求处理前 semaphore.acquire(),结束后 semaphore.release(),shutdown 时先 close socket,再 semaphore.acquire(blocking=False) 循环直到计数为 0
  • 别用 ThreadingHTTPServer 默认的 daemon thread,否则主线程一退,子线程直接消失;改用非 daemon + 显式 join

最小可行信号钩子:

import signal
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler
<p>class Counter:
def <strong>init</strong>(self): self.n = 0
def inc(self): self.n += 1
def dec(self): self.n -= 1
def done(self): return self.n == 0</p><p>counter = Counter()
server = None</p><p>def handle_sigterm(signum, frame):
print("SIGTERM received, stopping server...")
server.shutdown()  # 停新连接
while not counter.done():
time.sleep(0.1)  # 等现有请求结束
exit(0)</p><p>signal.signal(signal.SIGTERM, handle_sigterm)</p>

平滑关闭最难的不是写几行信号代码,而是确认所有异步 I/O、数据库连接池、后台心跳线程都真的能响应 shutdown 通知——它们往往藏在第三方库深处,不看文档+不测压测,上线后第一个大流量就露馅。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1911

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5404

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1869

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

32877

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3867

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3887

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1283

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3003

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程