扭曲的Python暂停/推迟反应堆

时间:2013-12-23 16:54:24

标签: python twisted reactor

我很擅长扭曲,我有一个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)

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

我希望我已经足够精确了。 提前谢谢。

Jeppo

1 个答案:

答案 0 :(得分:4)

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

相反,如果想要按 N 秒延迟某些内容,请使用reactor.callLater(N, someFunction)

从您的程序中删除sleep次调用后,因为您已停止反应堆处理事件而导致无关的超时问题将会消失。