У меня есть сценарий, в котором мне нужно проверить функциональность, если процесс проверки занимает больше заданного времени ожидания, тогда будет выдано исключение, в противном случае оно завершится при первом успехе.
Для этого запроса я сначала реализовал таймер с использованием генератора следующим образом:
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()
Теоретически оба варианта реализации должны работать, однако я хотел бы знать, считаете ли вы, что один лучше другого или оба одинаково хороши.
Также, пожалуйста, дайте мне знать, если у вас есть другие предложения.