|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import subprocess
- import sys
- import os
- import time
- import signal
-
- processes = []
-
-
- def start_fastapi():
- """ 启动 FastAPI 服务 """
- environment = os.environ.get('environment', 'default')
- if environment == 'default':
- process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"])
- else:
- process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "5000"])
- return process
-
- def start_celery_worker():
- """ 启动 Celery Worker """
- if sys.platform == "win32":
- process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info", "-P", "solo"],
- stdout=None, stderr=None)
- else:
- process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info"],
- stdout=None, stderr=None)
- return process
-
- def start_celery_beat():
- """ 启动 Celery Beat,使用 RedBeat 作为调度器 """
- process = subprocess.Popen(["celery", "-A", "celery_app", "beat", "--scheduler", "redbeat.RedBeatScheduler", "--loglevel=info"],
- stdout=None, stderr=None)
- return process
-
- if __name__ == "__main__":
- # 启动 FastAPI、Celery Worker 和 Celery Beat
- fastapi_process = start_fastapi()
- celery_worker_process = start_celery_worker()
- celery_beat_process = start_celery_beat()
-
- # 等待子进程完成
- fastapi_process.wait()
- celery_worker_process.wait()
- celery_beat_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)
-
- # 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,信号处理程序会处理
|