Пауза перед повторной попыткой подключения в Python

Я пытаюсь подключиться к серверу. Иногда я не могу подключиться к серверу и хотел бы сделать паузу на несколько секунд, прежде чем повторить попытку. Как бы я реализовал функцию паузы в Python. Вот что у меня есть до сих пор. Спасибо.

   while True:
        try:
            response = urllib.request.urlopen(http)
        except URLError as e:
            continue
        break

Я использую Python 3.2


person David    schedule 03.05.2011    source источник


Ответы (2)


Это заблокирует поток на 2 секунды, прежде чем продолжить:

import time
time.sleep(2)
person Ben Hoffstein    schedule 03.05.2011
comment
Поместите это в свой пункт except. - person Santa; 04.05.2011
comment
Вероятно, вам следует добавить ограничитель (скажем, 100 попыток запроса) и громко прерываться, когда такое событие происходит. Хоть зарегистрируйся. Действительно бесконечные тихие циклы onError могут быть трудны для отладки. - person Paweł Polewicz; 26.11.2011

В случае, если вы хотите запускать множество из них параллельно, было бы намного лучше использовать асинхронную сетевую структуру, такую ​​как Twisted, где «спящий» не означает, что ценный и дорогостоящий поток ОС не может выполнять какую-либо другую полезную работу. Вот грубый набросок того, как вы можете выполнять столько запросов параллельно, сколько пожелаете (установите значение 100), с тайм-аутом (5 секунд), задержкой (2 секунды) и настраиваемым количеством повторных попыток (здесь 10).

from twisted.internet import defer, reactor
from twisted.web import client

# A semaphore lets you run up to `token` deferred operations in parallel
semaphore = defer.DeferredSemaphore(tokens=100)

def job(url, tries=1, d=None):
    if not d:
        d = defer.succeed(None)
    d.addCallback(lambda ignored: client.getPage(url, timeout=5))
    d.addCallback(doSomethingWithData)
    def retry(failure):
        if tries > 10:
            return failure # give up
        else:
            # try again in 2 seconds
            d = defer.succeed(None)
            reactor.callLater(2, job, url, tries=tries+1, d=d)
            return d
    d.addErrback(retry)
    return d

for url in manyURLs:
    semaphore.run(job, url)
person Luke Marsden    schedule 04.05.2011