есть ли тупик в моем простом коде l oop - PullRequest
0 голосов
/ 26 марта 2020

У меня есть микросервис с заданием, которое должно выполняться только при работающем другом сервере. в течение нескольких недель он прекрасно работает, если сервер не работает, микросервис немного спит, не выполняя работу (как следует), а если сервер не работает - работа была выполнена. сервер никогда не выключается более чем на несколько минут (наверняка! сервер тщательно контролируется), поэтому задание пропускается до 2-3 раз.

Сегодня я вошел в свой Docker контейнер и заметил в журналы о том, что работа даже не пыталась продолжаться в течение нескольких недель (плохой выбор, чтобы не контролировать, я знаю), указывая, что я предполагаю, что произошел какой-то тупик. Я также предполагаю, что проблема связана с моей обработкой исключений, мог бы воспользоваться некоторыми советами, которые я работаю в одиночку.

def is_server_healthy():
    url = "url" #correct url for health check path
    try:
        res = requests.get(url)
    except Exception as ex:
        LOGGER.error(f"Can't health check!{ex}")
    finally:
        pass

    return res

def init():
    while True:
        LOGGER.info(f"Sleeping for {SLEEP_TIME} Minutes")
        time.sleep(SLEEP_TIME*ONE_MINUTE)

        res = is_server_healthy()

        if res.status_code == 200:
            my_api.DoJob()
            LOGGER.info(f"Server is: {res.text}")
        else:
            LOGGER.info(f"Server is down... {res.status_code}")

(имена переменных были изменены, чтобы упростить вопрос)

Здоровье проверить достаточно просто - вернуть "вверх", если вверх. все остальное считается неработоспособным, поэтому, если статус 200 и «вверх» не вернулись, я считаю, что сервер не работает.

1 Ответ

2 голосов
/ 26 марта 2020

Если ваш сервер не работает, вы получаете неперехваченную ошибку:

NameError: name 'res' is not defined

Почему? См .:

def is_server_healthy():
    url = "don't care"
    try:
        raise Exception()  # simulate fail
    except Exception as ex:
        print(f"Can't health check!{ex}")
    finally:
        pass

    return res   ## name is not known ;o)

res = is_server_healthy()
if res.status_code == 200:   # here, next exception bound to happen
    my_api.DoJob()
    LOGGER.info(f"Server is: {res.text}")
else:
    LOGGER.info(f"Server is down... {res.status_code}")

Даже если вы объявите имя, он попытается получить доступ к некоторому атрибуту, которого там нет:

if res.status_code == 200:   # here - object has no attribute 'status_code'   
    my_api.DoJob()
    LOGGER.info(f"Server is: {res.text}")
else:
    LOGGER.info(f"Server is down... {res.status_code}")

попытается получить доступ к члену этого просто нет => Исключение и процесс завершен.


Возможно, вам лучше использовать какой-то системный c способ вызова скрипта раз в минуту (Cron Jobs, Task Scheduler), затем на холостом ходу while True: со сном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...