启动进程放入 try catch 保证任务收到SIGINT后,能够正常退出

This commit is contained in:
glide-the 2023-09-04 23:03:56 +08:00
parent aa4a5ad224
commit 35f2c04535
1 changed files with 25 additions and 13 deletions

View File

@ -565,9 +565,7 @@ async def start_main_server():
args=(queue, process_count() + 1, log_level),
daemon=True,
)
process.start()
# 使用await asyncio.sleep(3)可以让后续代码等待一段时间
await asyncio.sleep(3)
processes["controller"] = process
process = Process(
@ -576,7 +574,6 @@ async def start_main_server():
args=(queue, process_count() + 1),
daemon=True,
)
process.start()
processes["openai_api"] = process
if args.model_worker:
@ -588,7 +585,7 @@ async def start_main_server():
args=(args.model_name, args.controller_address, queue, process_count() + 1, log_level),
daemon=True,
)
process.start()
processes["model_worker"] = process
if args.api_worker:
@ -601,7 +598,7 @@ async def start_main_server():
args=(model_name, args.controller_address, queue, process_count() + 1, log_level),
daemon=True,
)
process.start()
processes["online-api"].append(process)
if args.api:
@ -611,7 +608,7 @@ async def start_main_server():
args=(queue, process_count() + 1),
daemon=True,
)
process.start()
processes["api"] = process
if args.webui:
@ -621,13 +618,26 @@ async def start_main_server():
args=(queue, process_count() + 1),
daemon=True,
)
process.start()
processes["webui"] = process
if process_count() == 0:
parser.print_help()
else:
try:
# 保证任务收到SIGINT后能够正常退出
processes["controller"].start()
# 使用await asyncio.sleep(3)可以让后续代码等待一段时间
await asyncio.sleep(3)
processes["openai_api"].start()
processes["model_worker"].start()
for p in processes["online-api"]:
p.start()
processes["api"].start()
processes["webui"].start()
while True:
no = queue.get()
if no == process_count():
@ -652,16 +662,19 @@ async def start_main_server():
# model_worker_process.terminate()
# for process in processes.pop("online-api", []):
# process.terminate()
# for name, process in processes.items():
# process.terminate()
# for process in processes.values():
#
# if isinstance(process, list):
# for work_process in process:
# work_process.terminate()
# else:
# process.terminate()
logger.warning("Caught KeyboardInterrupt! Setting stop event...")
finally:
# Send SIGINT if process doesn't exit quickly enough, and kill it as last resort
# .is_alive() also implicitly joins the process (good practice in linux)
# while alive_procs := [p for p in processes.values() if p.is_alive()]:
for p in processes.values():
logger.info("Process status: %s", p)
for p in processes.values():
logger.warning("Sending SIGKILL to %s", p)
# Queues and other inter-process communication primitives can break when
@ -674,7 +687,6 @@ async def start_main_server():
else:
p.kill()
sleep(.01)
for p in processes.values():
logger.info("Process status: %s", p)