要結束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秒,直到反應器關閉。
我知道停止方法,但errback也會在連接終止時調用。是否有一種簡單的方法來區分成功的連接與終止連接和errback中的連接失敗? – Michal
關閉errback?你需要在你的問題中提供更多的代碼。通常關閉只是調用你的''protocol'' connectionLost'並且不會觸發延遲,我很困惑你的情況是如何發生的。您可以在[this](http://stackoverflow.com/a/23274411/3334178)中的示例代碼中查看我正在討論的close的樣式prev answer –
等待,您是否專門討論'agent.request '打電話? (I.E.你沒有用'listenTCP'或類似的東西來連接你自己)我給了一個更扭曲的代碼扭曲的答案。 –