Какое решение является предпочтительным для обеспечения тайм-аута функции в Python - PullRequest
0 голосов
/ 13 июня 2019

У меня есть сценарий, в котором мне нужно проверить функциональность, если процесс проверки занимает больше заданного времени ожидания, тогда будет выдано исключение, в противном случае оно завершится при первом успехе.

Для этого запроса я сначала реализовал таймер с использованием генератора следующим образом:

def timer(sec):
    start=time.time()
    curr=start
    while curr-start < sec:
        yeild curr
        curr=time.time()

Впоследствии я подумал о двух возможных реализациях для обеспечения тайм-аута функции валидатора.

Первое внедрение:

Первая реализация предполагает, что функция валидатора вернет True / False для успеха / неудачи:

def validator_function():
    <do something>
    if success:
        return True
    else:
        return False

И применение тайм-аута для функции валидатора будет выглядеть следующим образом:

def validate_function_with_timeout(timeout_in_sec):
    for _ in timer(timeout_in_sec):
        if validator_function():
            break
    else:
        raise Exception("Validation did not succeed during  '{}' seconds".format(timeout_in_sec))

Вторая реализация:

Вторая реализация предполагает, что функция валидатора сразу выдаст исключение, если условия не будут выполнены:

def validator_function():
    <do something>
    assert <condition> , "Validation failed"

И применение тайм-аута для функции валидатора будет выглядеть следующим образом:

def validate_function_with_timeout(timeout_in_sec):
    for _ in timer(timeout_in_sec):
        try:
            validator_function()
            break
        except:
            print("Validation did not succeed at this retry")
    else:
        validator_function()

Теоретически оба варианта реализации должны работать, однако я хотел бы знать, считаете ли вы, что один лучше другого или оба одинаково хороши. Также, пожалуйста, дайте мне знать, если у вас есть другие предложения.

...