1

我对扭曲很陌生,我有一个 HTTP 客户端,它查询一个有速率限制的服务器,当我达到这个限制时,服务器会以 HTTP 204 响应,所以当我处理响应时,我可能会做一些讨厌的事情,像这样:

def handleResponse(r, ip):
if r.code == 204:
    print 'Got 204, sleeping'
    time.sleep(120)
    return None
else:
    jsonmap[ip] = ''
    whenFinished = twisted.internet.defer.Deferred()
    r.deliverBody(PrinterClient(whenFinished, ip))
    return whenFinished

我这样做是因为我想暂停所有任务。

以下是我想到的两种行为,要么在同一执行中重新运行之后达到 204 的任务(不知道是否可能),要么只记录错误并在之后在另一个执行中重新运行它们的程序。可能引发的另一个问题是,如果服务器没有响应,我已经在连接上设置了超时,以便在预定义的时间后取消延迟(参见下面的代码)

timeoutCall = reactor.callLater(60, d.cancel)
def completed(passthrough):
    if timeoutCall.active():
        timeoutCall.cancel()
    return passthrough
d.addCallback(handleResponse, ip)
d.addErrback(handleError, ip)
d.addBoth(completed)

我可能遇到的另一个问题是,如果我正在睡觉,我可能会遇到这个超时,我的所有请求都将被取消。

我希望我已经足够精确了。先感谢您。

捷波

4

2 回答 2

4

不要time.sleep(20)在任何基于 Twisted 的代码中使用。这违反了您可能正在使用的任何其他基于 Twisted 的代码的基本假设。

相反,如果想延迟N秒,请使用reactor.callLater(N, someFunction).

一旦你sleep从你的程序中删除了调用,仅仅因为你停止了反应器处理事件而导致不相关超时的问题就会消失。

于 2013-12-23T20:04:55.360 回答
0

对于任何偶然发现此线程的人,您必须永远不要调用time.sleep(...); 但是,可以创建一个Deferred除了睡眠什么都不做的...您可以使用它来将延迟组合到延迟链中:

   def make_delay_deferred(seconds, result=None):
       d = Deferred()
       reactor.callLater(seconds, d.callback, result)
       return d
于 2022-01-08T03:36:26.877 回答