2014-05-24 4 views
2

저는 Twisted에 익숙하지 않습니다. 마침내 지연이 어떻게 작동하는지 파악한 후에 작업에 어려움을 겪고 있습니다. 루프에서 REST 요청을 보내는 스크립트를 구현하는 것이 목표이지만 루프가 멈추는 지점에서 오류가 발생하면 중단해야합니다. 콜백을 사용하고 있기 때문에 쉽게 예외를 잡을 수 없으며 오류 복구에서 멈추는 방법을 모르기 때문에 막혔습니다.예외가 발생하면 작업을 중지합니다 .LoopingCall

이 내 코드의 단순화 된 버전은 다음과 같습니다

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를 호출하기 만하면됩니다.

어쨌든 그 변수를 cb_process_error이있는 클래스로 푸시하거나 pseudo-global 또는 문자 그대로 글로벌을 사용하는 다른 클래스를 통해 그 변수를 사용할 수있게해야합니다. 오류 회신 안에 list_call.stop()으로 전화하십시오.

은 BTW는 말했다 :

내가 콜백을 사용하고 있기 때문에 나는 쉽게 예외

그게 정말 사실이 아니다 잡을 수 없습니다. 예외를 처리하기위한 오류 복구의 요점은 말 그대로 문자 그대로 호출되는 것 중 하나입니다. 내 이전 deferred answer을 확인하고 오류가 더 명확하게되는지 확인하십시오.

다음 실행 가능한 예입니다 (... 나는 ...이 그것이 방법 단지 것을, 그것을 할 가장 방법입니다 말하는 게 아니에요) 가정

#!/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() 

google.com에 도달 할 수 있습니다. agent.request의 두 번째 인수를 http://127.0.0.1:12999 (포트 12999가 연결을 거부한다고 가정하면)으로 변경하면 10 초 동안 페이지를 가져올 수 있습니다. 그런 다음 1 회 오류 출력이 표시됩니다 loopingcall을 종료하고) 리액터가 정지 할 때까지 10 초 기다린다.

+0

나는 stop 방법에 대해 알고 있지만, 연결이 끊어지면 errback도 호출됩니다. 성공적인 연결과 종료의 구분을 쉽게 할 수있는 방법이 있습니까? – Michal

+0

닫기에서 오류 수정이 호출됩니다. 질문에 더 많은 코드를 제공해야합니다. 일반적으로 close는 단지'프로토콜'의'connectionLost'를 호출하고 연기되지는 않습니다. 당신의 경우에 어떻게 일어나고 있는지 혼란 스럽습니다. 당신은 내가 [이] (http://stackoverflow.com/a/23274411/3334178)의 예제 코드에서 얘기하고있는 닫는 스타일을 볼 수 있습니다 prev 대답 –

+0

잠깐, 당신은 배타적으로'agent.request '전화? (I.E. 너 자신이'listenTCP' 등과 연결을하지 않는다.) 나는 꼬인 코드로 좀더 genaric 한 답을주고 있었다. –

관련 문제