【发布时间】:2013-12-23 16:54:23
【问题描述】:
我对 twisted 很陌生,我有一个 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)
我可能遇到的另一个问题是,如果我正在睡觉,我可能会遇到此超时,并且我的所有请求都将被取消。
我希望我已经足够精确了。 提前谢谢你。
杰波
【问题讨论】: