Python способ проверить состояние с таймаутом - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно проверить определенное состояние до истечения времени ожидания.Если условие выполнено до ограничения, тогда я возвращаю True, в противном случае я возвращаю False.

Я делаю это следующим образом

counter = 1
condition_met = False
while counter < max_limit:
    if <conditions are met>:
        condition_met = True
        break
    time.sleep(10)
    counter += 1
return condition_met

Мне интересно, есть ли более питоническийспособ сделать то же самое.

Заранее спасибо за ваши отзывы

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Если бы не time.sleep, ваш цикл был бы эквивалентен

for _ in range(max_limit):
    if <condition>:
        return True
    # time.sleep(10)
return False

, что эквивалентно return any(<condition> for _ in range(max_limit).

Таким образом, вы могли бы (ab) использоватьany и or, чтобы проверить, выполняется ли условие до определенного количества раз, ожидая бит перед каждой проверкой:

any(time.sleep(10) or <condition> for _ in range(max_limit))

Сначала будет оцениваться time.sleep, что возвращает None, а затем оцените условие до тех пор, пока условие не будет выполнено или пока range не будет исчерпано.

Единственное предостережение в том, что это вызовет time.sleep даже до первой проверки условия.Чтобы это исправить, вы можете сначала проверить переменную счетчика, и только если это > 0 call time.sleep:

any(i and time.sleep(10) or <condition> for i in range(10))

Вопрос о том, яснее ли это, чем длинный цикл, решать вам.


Как предлагается в комментариях , на самом деле вы можете просто инвертировать вышеуказанное предложение any в

any(<condition> or time.sleep(10) for _ in range(max_limit))

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

0 голосов
/ 07 декабря 2018

Действительно хороший способ измерения времени - использование модуля shock time:

import time

def foo():
    max_limit = 25  # Seconds.

    start = time.time()
    condition_met = False
    while time.time() - start < max_limit:
        if <conditions are met>:
            condition_met = True
            break
        time.sleep(10)

    return condition_met

Видите?Модуль хорош не только для sleep.;¬)

0 голосов
/ 07 декабря 2018

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

counter = 1
# condition_met = False
while counter < max_limit:
    if <conditions are met>:
        # condition_met = True
        return True   # get rid of break statement
    time.sleep(10)
    counter += 1
return False
...