Спи в случае ошибки, питон - PullRequest
0 голосов
/ 23 июня 2018

Таким образом, у меня есть ситуация, когда я должен использовать подключение к Интернету в течение 12 часов подряд и звонить в API.Но свет продолжает гаснуть через каждые 10 минут.Можно написать попытку, кроме функции, которая вызовет задержку в 10 минут в случае возникновения ошибки тайм-аута.Надеемся, что электричество вернется через 10 минут.Вот что я сейчас использую:

try:
        a=translator.translate(str(x1),dest='hi')   
        b=translator.translate(str(x2),dest='hi')
    except:
        sleep(60*10)

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Вы можете использовать модуль retry для такого рода попыток при исключении.Это делает код выглядеть намного чище.pip install retry должен установить модуль

from retry import retry

@retry(Exception, delay=10*60, tries=-1)
def my_code_that_needs_to_be_retried_for_ever():
    a=translator.translate(str(x1),dest='hi')   
    b=translator.translate(str(x2),dest='hi')

# Call the function
my_code_that_needs_to_be_retried_for_ever()

При использовании вышеуказанного кода при вызове my_code_that_needs_to_be_retried_for_ever он будет повторяться каждые 60 * 10 секунд (10 минут) навсегда (поскольку для попытки задано -1)каждый раз, когда код внутри функционального блока вызывает исключение

0 голосов
/ 23 июня 2018

Используйте try и except, чтобы перехватить исключение, а затем time.sleep, чтобы ваш скрипт Python спал в течение требуемого промежутка времени. Затем вы можете поместить все в бесконечный цикл while и break из него, как только все закончится.

while True:
    try:
        # put everything here which might produce exception
        pass 
        # if this point is reached everything worked fine, so exit loop
        break
    except:
        time.sleep(10*60)

Вы можете запустить следующий пример, чтобы увидеть общую идею:

import random
import time

print("Before loop")

while True:
    try:
        print("Try to execute commands")
        # your commands here
        if random.random() > 0.3:
            print("Randomly simulate timeout")
            raise Exception("Timeout")
        print("Everything done")
        break
    except:
        print("Timeout: sleep for 2 seconds and try again")
        time.sleep(2)

print("After loop")

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

Before loop
Try to execute commands
Randomly simulate timeout
Timeout: sleep for 2 seconds and try again
Try to execute commands
Randomly simulate timeout
Timeout: sleep for 2 seconds and try again
Try to execute commands
Randomly simulate timeout
Timeout: sleep for 2 seconds and try again
Try to execute commands
Everything done
After loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...