Пауза перед повторным подключением в Python - PullRequest
2 голосов
/ 04 мая 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 04 мая 2011

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

import time
time.sleep(2)
3 голосов
/ 04 мая 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)
...