簡體   English   中英

扭曲的 Python 暫停/延遲反應器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM