2014-05-24 49 views
2

我是Twisted的新手,並且在終於弄清楚延遲是如何工作的之後,我正在努力完成任務。我想實現的是讓腳本在循環中發送一個REST請求,但是如果在某個點失敗,我想停止循環。由於我使用回調函數,因此我不能輕易捕捉異常,並且因爲我不知道如何停止errback循環,所以我被卡住了。如果發生異常,停止任務。放棄呼叫

這是我的代碼的簡化版本:

def send_request(): 
    agent = Agent(reactor) 
    req_result = agent.request('GET', some_rest_link) 
    req_result.addCallbacks(cp_process_request, cb_process_error) 

if __name__ == "__main__": 
    list_call = task.LoopingCall(send_request) 
    list_call.start(2) 
    reactor.run() 

回答

3

要結束task.LoopingCall所有你需要做的就是調用(你的情況list_call)返回的對象上stop

不知怎的,你需要使可用的VAR您errback可(cb_process_error)或者通過將其推入一類cb_process_error是,通過使用一些其他類僞全球或字面上使用一個全球性的,那麼你只需在errback中調用list_call.stop()

BTW你說:

由於我使用的回調我不能輕易地捕捉異常

那不是真的。處理異常的錯誤之處在於,這就是字面上導致它被調用的事情之一!看看我以前的deferred answer,看看它是否使errbacks更清晰。

下面是一個可運行的例子(...我不是說這是做的最好的方式,只是它是一個方式 ...)

#!/usr/bin/python 

from twisted.internet import task 
from twisted.internet import reactor 
from twisted.internet.defer import Deferred 
from twisted.web.client import Agent 
from pprint import pprint 

class LoopingStuff (object): 

    def cp_process_request(self, return_obj): 
     print "In callback" 
     pprint (return_obj) 

    def cb_process_error(self, return_obj): 
     print "In Errorback" 
     pprint(return_obj) 
     self.loopstopper() 

    def send_request(self): 
     agent = Agent(reactor) 
     req_result = agent.request('GET', 'http://google.com') 
     req_result.addCallbacks(self.cp_process_request, self.cb_process_error) 

def main(): 
    looping_stuff_holder = LoopingStuff() 
    list_call = task.LoopingCall(looping_stuff_holder.send_request) 
    looping_stuff_holder.loopstopper = list_call.stop 
    list_call.start(2) 
    reactor.callLater(10, reactor.stop) 
    reactor.run() 

if __name__ == '__main__': 
    main() 

假設如果將agent.request的第二個參數更改爲http://127.0.0.1:12999(假設端口12999將拒絕連接),則可以訪問google.com,這將獲取頁面10秒,然後您將看到1個errback打印輸出關閉循環呼叫)並等待10秒,直到反應器關閉。

+0

我知道停止方法,但errback也會在連接終止時調用。是否有一種簡單的方法來區分成功的連接與終止連接和errback中的連接失敗? – Michal

+0

關閉errback?你需要在你的問題中提供更多的代碼。通常關閉只是調用你的''protocol'' connectionLost'並且不會觸發延遲,我很困惑你的情況是如何發生的。您可以在[this](http://stackoverflow.com/a/23274411/3334178)中的示例代碼中查看我正在討論的close的樣式prev answer –

+0

等待,您是否專門討論'agent.request '打電話? (I.E.你沒有用'listenTCP'或類似的東西來連接你自己)我給了一個更扭曲的代碼扭曲的答案。 –