[英]Twisted Python pause/postpone 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)
我可能遇到的另一個問題是,如果我正在睡覺,我可能會遇到這個超時,我的所有請求都將被取消。
我希望我已經足夠精確了。 先感謝您。
捷波
不要在任何基於Twisted的代碼中使用time.sleep(20)
。 這違反了您可能正在使用的任何其他基於Twisted的代碼所做的基本假設。
相反,如果想要延遲N秒,請使用reactor.callLater(N, someFunction)
。
一旦你從程序中刪除了sleep
調用,因為你已經停止反應堆處理事件而導致無關的超時問題就會消失。
對於任何偶然發現這個線程的人,你必須永遠不要調用time.sleep(...)
; 但是,可以創建一個除了睡眠什么都不做的Deferred
......您可以使用它來將延遲組合到一個延遲鏈中:
def make_delay_deferred(seconds, result=None):
d = Deferred()
reactor.callLater(seconds, d.callback, result)
return d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.