不处理退出信号
This commit is contained in:
76
main.py
76
main.py
@@ -1,4 +1,3 @@
|
||||
|
||||
from datetime import datetime
|
||||
import os
|
||||
import traceback
|
||||
@@ -22,6 +21,7 @@ from sqlalchemy import text
|
||||
LoggerManager.setup_logging()
|
||||
logger = get_main_logger()
|
||||
|
||||
|
||||
def global_exception_handler(exc_type, exc_value, exc_traceback):
|
||||
if issubclass(exc_type, KeyboardInterrupt):
|
||||
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
||||
@@ -32,7 +32,7 @@ def global_exception_handler(exc_type, exc_value, exc_traceback):
|
||||
error_msg += f"异常类型: {exc_type.__name__}\n"
|
||||
error_msg += f"异常信息: {exc_value}\n"
|
||||
error_msg += "堆栈跟踪:\n"
|
||||
error_msg += ''.join(traceback.format_tb(exc_traceback))
|
||||
error_msg += "".join(traceback.format_tb(exc_traceback))
|
||||
error_msg += f"异常时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
|
||||
error_msg += "-" * 50 + "\n"
|
||||
|
||||
@@ -42,9 +42,11 @@ def global_exception_handler(exc_type, exc_value, exc_traceback):
|
||||
# 输出到文件
|
||||
logger.error(error_msg)
|
||||
|
||||
|
||||
# 注册全局异常处理器
|
||||
sys.excepthook = global_exception_handler
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
# 启动时初始化
|
||||
@@ -168,6 +170,7 @@ async def health_check():
|
||||
# 全局变量存储进程
|
||||
processes = []
|
||||
|
||||
|
||||
def signal_handler(signum, frame):
|
||||
"""信号处理器,用于优雅关闭所有服务"""
|
||||
print(f"\n🛑 接收到信号 {signum},正在关闭所有服务...")
|
||||
@@ -189,6 +192,7 @@ def signal_handler(signum, frame):
|
||||
print("👋 所有服务已关闭")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def start_all_services():
|
||||
"""启动所有服务"""
|
||||
global processes
|
||||
@@ -197,34 +201,44 @@ def start_all_services():
|
||||
print("=" * 60)
|
||||
|
||||
# 注册信号处理器
|
||||
signal.signal(signal.SIGINT, signal_handler) # Ctrl+C
|
||||
signal.signal(signal.SIGTERM, signal_handler) # 终止信号
|
||||
# signal.signal(signal.SIGINT, signal_handler) # Ctrl+C
|
||||
# signal.signal(signal.SIGTERM, signal_handler) # 终止信号
|
||||
|
||||
try:
|
||||
# 1. 启动 Celery Worker
|
||||
print("🌿 启动 Celery Worker...")
|
||||
worker_process = subprocess.Popen([
|
||||
sys.executable, "-m", "celery",
|
||||
"-A", "app.celery_app",
|
||||
"worker",
|
||||
'--loglevel=info',
|
||||
'--pool=solo',
|
||||
'--concurrency=1',
|
||||
'--time-limit=300', # 5分钟任务超时
|
||||
'--soft-time-limit=240' # 4分钟软超时
|
||||
])
|
||||
worker_process = subprocess.Popen(
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"celery",
|
||||
"-A",
|
||||
"app.celery_app",
|
||||
"worker",
|
||||
"--loglevel=info",
|
||||
"--pool=solo",
|
||||
"--concurrency=1",
|
||||
"--time-limit=300", # 5分钟任务超时
|
||||
"--soft-time-limit=240", # 4分钟软超时
|
||||
]
|
||||
)
|
||||
processes.append(worker_process)
|
||||
time.sleep(2) # 等待 Worker 启动
|
||||
|
||||
# 2. 启动 Celery Beat
|
||||
print("\n📅 启动 Celery Beat...")
|
||||
beat_process = subprocess.Popen([
|
||||
sys.executable, "-m", "celery",
|
||||
"-A", "app.celery_app",
|
||||
"beat",
|
||||
'--loglevel=info',
|
||||
f'--schedule={os.path.join(tempfile.gettempdir(), "celerybeat-schedule")}'
|
||||
])
|
||||
beat_process = subprocess.Popen(
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"celery",
|
||||
"-A",
|
||||
"app.celery_app",
|
||||
"beat",
|
||||
"--loglevel=info",
|
||||
f'--schedule={os.path.join(tempfile.gettempdir(), "celerybeat-schedule")}',
|
||||
]
|
||||
)
|
||||
processes.append(beat_process)
|
||||
time.sleep(2) # 等待 Beat 启动
|
||||
|
||||
@@ -232,11 +246,14 @@ def start_all_services():
|
||||
if settings.flower_enabled:
|
||||
print("\n📊 启动 Flower 监控服务...")
|
||||
flower_cmd = [
|
||||
sys.executable, "-m", "celery",
|
||||
"-A", "app.celery_app",
|
||||
sys.executable,
|
||||
"-m",
|
||||
"celery",
|
||||
"-A",
|
||||
"app.celery_app",
|
||||
f"--broker={settings.celery_broker_url}",
|
||||
"flower",
|
||||
f"--port={settings.flower_port}"
|
||||
f"--port={settings.flower_port}",
|
||||
]
|
||||
|
||||
if settings.flower_basic_auth:
|
||||
@@ -251,10 +268,14 @@ def start_all_services():
|
||||
# 4. 启动 FastAPI 应用
|
||||
print("\n🚀 启动 FastAPI 应用...")
|
||||
api_cmd = [
|
||||
sys.executable, "-m", "uvicorn",
|
||||
sys.executable,
|
||||
"-m",
|
||||
"uvicorn",
|
||||
"main:app",
|
||||
"--host", "0.0.0.0",
|
||||
"--port", "8000"
|
||||
"--host",
|
||||
"0.0.0.0",
|
||||
"--port",
|
||||
"8000",
|
||||
]
|
||||
|
||||
# 添加调试模式(如果配置了)
|
||||
@@ -293,6 +314,7 @@ def start_all_services():
|
||||
print(f"❌ 启动服务时出错: {e}")
|
||||
signal_handler(signal.SIGINT, None)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 直接启动所有服务
|
||||
start_all_services()
|
||||
|
||||
Reference in New Issue
Block a user