Skip to content

Commit a7676f5

Browse files
committed
feat: add graceful shutdown with signal handler
- Add SIGINT/SIGTERM signal handler for graceful exit - Cancel all running tasks on shutdown - Reduce default HTTP timeout from 30s to 10s for faster Ctrl+C response - Support double Ctrl+C for forced exit
1 parent 744b1f4 commit a7676f5

2 files changed

Lines changed: 30 additions & 1 deletion

File tree

src/core/http_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
@dataclass
2323
class RequestConfig:
2424
"""HTTP 请求配置"""
25-
timeout: int = 30
25+
timeout: int = 10 # 降低默认超时,让 Ctrl+C 响应更快
2626
max_retries: int = 3
2727
retry_delay: float = 1.0
2828
impersonate: str = "chrome"

src/web/app.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import logging
77
import sys
8+
import signal
89
import secrets
910
import hmac
1011
import hashlib
@@ -26,6 +27,34 @@
2627

2728
logger = logging.getLogger(__name__)
2829

30+
# 优雅退出标志
31+
_shutdown_requested = False
32+
33+
34+
def _signal_handler(signum, frame):
35+
"""信号处理器:Ctrl+C 时优雅退出"""
36+
global _shutdown_requested
37+
if _shutdown_requested:
38+
logger.warning("收到第二次退出信号,强制退出")
39+
sys.exit(1)
40+
41+
_shutdown_requested = True
42+
logger.info("收到退出信号,正在关闭...")
43+
44+
# 取消所有运行中的任务
45+
from .task_manager import _task_cancelled
46+
for task_uuid in list(_task_cancelled.keys()):
47+
task_manager.cancel_task(task_uuid)
48+
49+
logger.info("已取消所有运行中的任务")
50+
sys.exit(0)
51+
52+
53+
# 注册信号处理器
54+
signal.signal(signal.SIGINT, _signal_handler)
55+
if hasattr(signal, "SIGTERM"):
56+
signal.signal(signal.SIGTERM, _signal_handler)
57+
2958
# 获取项目根目录
3059
# PyInstaller 打包后静态资源在 sys._MEIPASS,开发时在源码根目录
3160
if getattr(sys, 'frozen', False):

0 commit comments

Comments
 (0)