Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

run.py 2.7KB

il y a 1 mois
il y a 2 semaines
il y a 1 mois
il y a 3 semaines
il y a 1 mois
il y a 3 semaines
il y a 1 mois
il y a 2 semaines
il y a 1 mois
il y a 2 semaines
il y a 3 semaines
il y a 2 semaines
il y a 1 mois
il y a 3 semaines
il y a 3 semaines
il y a 3 semaines
il y a 1 semaine
il y a 1 mois
il y a 1 semaine
il y a 3 semaines
il y a 2 semaines
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import subprocess
  2. import sys
  3. import os
  4. import time
  5. import signal
  6. processes = []
  7. def start_fastapi():
  8. """ 启动 FastAPI 服务 """
  9. environment = os.environ.get('environment', 'default')
  10. if environment == 'default':
  11. process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"])
  12. else:
  13. process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "5000"])
  14. return process
  15. def start_celery_worker():
  16. """ 启动 Celery Worker """
  17. if sys.platform == "win32":
  18. process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info", "-P", "solo"],
  19. stdout=None, stderr=None)
  20. else:
  21. process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info"],
  22. stdout=None, stderr=None)
  23. return process
  24. def start_celery_beat():
  25. """ 启动 Celery Beat,使用 RedBeat 作为调度器 """
  26. process = subprocess.Popen(["celery", "-A", "celery_app", "beat", "--scheduler", "redbeat.RedBeatScheduler", "--loglevel=info"],
  27. stdout=None, stderr=None)
  28. return process
  29. if __name__ == "__main__":
  30. # 启动 FastAPI、Celery Worker 和 Celery Beat
  31. fastapi_process = start_fastapi()
  32. celery_worker_process = start_celery_worker()
  33. celery_beat_process = start_celery_beat()
  34. # 等待子进程完成
  35. fastapi_process.wait()
  36. celery_worker_process.wait()
  37. celery_beat_process.wait()
  38. # def signal_handler(sig, frame):
  39. # """处理退出信号,确保子进程也被终止"""
  40. # print('正在关闭所有服务...')
  41. # for process in processes:
  42. # process.terminate() # 尝试优雅终止
  43. # # 给进程一点时间来优雅终止
  44. # time.sleep(2)
  45. # # 检查是否有进程仍在运行,如果有则强制终止
  46. # for process in processes:
  47. # if process.poll() is None: # 进程仍在运行
  48. # process.kill() # 强制终止
  49. # sys.exit(0)
  50. # if __name__ == "__main__":
  51. # # 注册信号处理程序
  52. # signal.signal(signal.SIGINT, signal_handler) # Ctrl+C
  53. # signal.signal(signal.SIGTERM, signal_handler) # 终止信号
  54. # # 启动 FastAPI、Celery Worker 和 Celery Beat
  55. # #fastapi_process = start_fastapi()
  56. # celery_worker_process = start_celery_worker()
  57. # celery_beat_process = start_celery_beat()
  58. # # 让主进程保持运行,但不阻塞在特定子进程上
  59. # try:
  60. # while True:
  61. # time.sleep(1) # 简单地循环等待,让信号处理程序有机会工作
  62. # except KeyboardInterrupt:
  63. # pass # 如果收到 KeyboardInterrupt,信号处理程序会处理