在Python中重试连接前暂停

2 投票
2 回答
2540 浏览
提问于 2025-04-16 16:56

我正在尝试连接到一个服务器。有时候我无法连接上这个服务器,我想在再试一次之前暂停几秒钟。请问我该如何在Python中实现这个暂停功能呢?这是我目前的代码。谢谢。

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

我使用的是Python 3.2

2 个回答

4

如果你想同时运行很多这样的任务,使用一个异步网络框架会更好,比如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)
7

这段代码会让程序暂停2秒钟,然后再继续执行:

import time
time.sleep(2)

撰写回答