H Vs пре 3 недеља
родитељ
комит
119a8e89c8
1 измењених фајлова са 35 додато и 39 уклоњено
  1. +35
    -39
      run.py

+ 35
- 39
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)

Loading…
Откажи
Сачувај