Как лучше всего программно остановить сервер Uvicorn?

В Docker я запускаю uvicorn с bootstrap.sh и командной строкой. В коде есть условие о файле открытого ключа, если возникает исключение, сервер должен быть выключен.

Итак, то, что я хочу сделать в main.py, находится здесь (это FastAPI).

public_key = None

try:
    with open(PUBLIC_KEY_FILE) as public_key_file:
        public_key = public_key_file.read()
except Exception as f_error:
    logger.exception(f_error)
    module = util.find_spec("uvicorn")

    if module:
        uvicorn = import_module('uvicorn')
        uvicorn.stop() # what I want to do

Однако я не смог найти способ программно отключить сервер uvicorn. Что было бы лучшим подходом?


person Omer Alkin    schedule 05.05.2021    source источник
comment
Вызов исключения (или повторный вызов f_error) внутри вашего предложения except приведет к завершению текущего приложения, если за пределами этого кода нет другого уровня обработки исключений. Будет ли это работать?   -  person MatsLindh    schedule 05.05.2021
comment
@MatsLindh Да, это работает, и на самом деле это неплохой обходной путь, спасибо!   -  person Omer Alkin    schedule 05.05.2021


Ответы (1)


Вызов исключения (или повторный вызов f_error) внутри вашего исключения приведет к завершению текущего приложения, если нет другого уровня обработки исключений за пределами кода, который вы включили.

Когда интерпретатор Python получает исключение верхнего уровня (т. е. такое, которое не перехвачено except), интерпретатор завершает работу. Вы можете использовать это, чтобы закрыть свой сценарий и запустить среду выполнения контейнера для перезапуска приложения по мере необходимости.

person MatsLindh    schedule 05.05.2021