From 119a8e89c8b7716b8cdeae9640dba5280137a504 Mon Sep 17 00:00:00 2001 From: H Vs Date: Wed, 2 Apr 2025 18:02:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 74 +++++++++++++++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/run.py b/run.py index 3cd9772..25ada67 100644 --- a/run.py +++ b/run.py @@ -6,10 +6,9 @@ import signal processes = [] - def start_fastapi(): """ 启动 FastAPI 服务 """ - environment = os.environ.get('environment', 'default') + environment = os.environ.get('environment', 'default') if environment == 'default': process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]) else: @@ -32,47 +31,44 @@ def start_celery_beat(): stdout=None, stderr=None) return process +def signal_handler(sig, frame): + """处理退出信号,确保子进程也被终止""" + print('正在关闭所有服务...') + for process in processes: + process.terminate() # 尝试优雅终止 + # 给进程一点时间来优雅终止 + time.sleep(2) + # 检查是否有进程仍在运行,如果有则强制终止 + for process in processes: + if process.poll() is None: # 进程仍在运行 + process.kill() # 强制终止 + sys.exit(0) + if __name__ == "__main__": - # 启动 FastAPI、Celery Worker 和 Celery Beat - fastapi_process = start_fastapi() + # 注册信号处理程序 + signal.signal(signal.SIGINT, signal_handler) # Ctrl+C + signal.signal(signal.SIGTERM, signal_handler) # 终止信号 + + # 启动 Celery Worker 和 Celery Beat celery_worker_process = start_celery_worker() celery_beat_process = start_celery_beat() - # 等待子进程完成 - #fastapi_process.wait() - celery_worker_process.wait() - celery_beat_process.wait() + # 将 Celery 进程添加到监控列表 + processes.append(celery_worker_process) + processes.append(celery_beat_process) + + # 启动并监控 FastAPI 进程 + while True: + fastapi_process = start_fastapi() + processes.append(fastapi_process) + print("FastAPI 服务已启动。") + # 等待 FastAPI 进程结束 + fastapi_process.wait() -# def signal_handler(sig, frame): -# """处理退出信号,确保子进程也被终止""" -# print('正在关闭所有服务...') -# for process in processes: -# process.terminate() # 尝试优雅终止 - -# # 给进程一点时间来优雅终止 -# time.sleep(2) - -# # 检查是否有进程仍在运行,如果有则强制终止 -# for process in processes: -# if process.poll() is None: # 进程仍在运行 -# process.kill() # 强制终止 - -# sys.exit(0) + # 如果 FastAPI 进程结束,移除它并记录日志 + processes.remove(fastapi_process) + print("FastAPI 服务意外终止,正在尝试重启...") -# if __name__ == "__main__": -# # 注册信号处理程序 -# signal.signal(signal.SIGINT, signal_handler) # Ctrl+C -# signal.signal(signal.SIGTERM, signal_handler) # 终止信号 - -# # 启动 FastAPI、Celery Worker 和 Celery Beat -# #fastapi_process = start_fastapi() -# celery_worker_process = start_celery_worker() -# celery_beat_process = start_celery_beat() - -# # 让主进程保持运行,但不阻塞在特定子进程上 -# try: -# while True: -# time.sleep(1) # 简单地循环等待,让信号处理程序有机会工作 -# except KeyboardInterrupt: -# pass # 如果收到 KeyboardInterrupt,信号处理程序会处理 + # 等待一段时间再重启,避免频繁重启 + time.sleep(5) \ No newline at end of file