【问题标题】:Pause before retry connection in Python在 Python 中重试连接之前暂停
【发布时间】:2011-05-03 21:50:13
【问题描述】:

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

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

我正在使用 Python 3.2

【问题讨论】:

    标签: python python-3.x urllib


    【解决方案1】:

    这会在继续之前阻塞线程 2 秒:

    import time
    time.sleep(2)
    

    【讨论】:

    • 把这个放在你的except子句中。
    • 您可能应该添加一个限制器(例如,100 次请求尝试)并在此类事件发生时大声中断。至少记录一下。真正无限静默的 onError 循环可能很难调试。
    【解决方案2】:

    如果您想并行运行很多这些,使用异步网络框架(例如 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      相关资源
      最近更新 更多