在Python中重试连接之前暂停

时间:2011-05-03 21:50:13

标签: python python-3.x urllib

我正在尝试连接到服务器。有时我无法到达服务器并想再次尝试之前暂停几秒钟。我如何在Python中实现暂停功能。这是我到目前为止所拥有的。谢谢。

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

我正在使用Python 3.2

2 个答案:

答案 0 :(得分:7)

这将阻止线程持续2秒,然后继续:

import time
time.sleep(2)

答案 1 :(得分:3)

如果你想并行运行大量这些,那么使用Twisted这样的异步网络框架会更具可扩展性,其中“休眠”并不意味着阻止有价值且昂贵的OS线程从做一些其他有用的工作。下面是如何根据需要并行尝试多个请求(设置为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)