2016-09-23 3 views
2

Txmongo lib와 함께 Twisted를 사용하고 있습니다. 다음 함수에서 5 초 후에 cancelTest()를 호출하려고합니다. 그러나 코드는 작동하지 않습니다. 어떻게 작동시킬 수 있습니까?일정 시간이 지난 후 콜백 함수를 호출하는 방법

from twisted.internet import task 

def diverge(self, d): 
    if d == 'Wait': 
     self.flag = 1 
     # self.timeInit = time.time() 
     clock = task.Clock() 
     for ip in self.ips: 
      if self.factory.dictQueue.get(ip) is not None: 
       self.factory.dictQueue[ip].append(self) 
      else: 
       self.factory.dictQueue[ip] = deque([self]) 
       # self.factory.dictQueue[ip].append(self) 

     log.msg("-----------------the queue after wait") 
     log.msg(self.factory.dictQueue) 
###############################HERE, this does not work 
     self.dtime = task.deferLater(clock, 5, self.printData) 
############################# 
     self.dtime.addCallback(self.cancelTest) 
     self.dtime.addErrback(log.err) 
    else: 
     self.cancelTimeOut() 
     d.addCallback(self.dispatch) 
     d.addErrback(log.err) 



def sendBackIP(self): 
    self.ips.pop(0) 
    log.msg("the IPs: %s" % self.ips) 

    d = self.factory.service.checkResource(self.ips) 

    d.addCallback(self.diverge) ###invoke above function 
    log.msg("the result from checkResource: ") 
    log.msg() 

답변

0

일반적으로 reactor.callLater()은 원하는 기능입니다. 기능 5 초 후에 호출 할 필요가 그래서 만약, 당신의 코드는 다음과 같습니다 이상하다

from twisted.internet import reactor 
reactor.callLater(5, cancelTest) 

한 것은 당신의 task.deferLater 구현도 작동해야한다는 것입니다. 그러나 코드의 자세한 내용을 보지 않고 나는 당신이 거의하고있는 이상한 :

참조

+0

Clock()은 IReactorTime의 결정적인 모의 구현이므로 clock.advance (5)가 호출되지 않으면 시계가 움직이지 않습니다. –

0

입니다한다는 것보다 더 서로를 도울 수 있다고 생각하지 않습니다 모든 게 맞아. 당신은 방금 시계 부분을 올바르게 얻지 못했습니다.

twisted.internet.task.Clock은 IReactorTime의 결정적 구현입니다. IReactorTime은 주로 코드에서 결정적 결과를 얻기위한 단위/통합 테스트에 사용됩니다. 프로덕션 환경에서 사용하면 안됩니다.

프로덕션 환경에서는 무엇을 사용해야합니까? 반응기! 사실, 모든 생산 원자로 구현은 IReactorTime 인터페이스를 구현합니다. 하지만, 당신은, 5 초 후 cancelTest를 호출 할 말 니펫 위의 텍스트에

:

from twisted.internet import reactor 
# (omissis) 
self.dtime = task.deferLater(reactor, 5, self.printData) 

그냥 몇 가지 sidenotes :

그냥 다음 가져 오기 및 함수 호출을 사용하여 실제로 printData를 호출하는 코드; 물론 printData가 무언가를 인쇄하고 즉각적인 값을 발생시키지 않는다면, 이것은 cancelTest 함수가 연쇄 된 callcack이기 때문에 즉시 실행되게 할 것입니다; 하지만 실제로 100 % 확신하려면 deferLater 내에서 cancelTest를 호출해야하며 printData가 아닌을 호출해야합니다.

또한 이것이 일종의 "제한 시간"인지 이해하지 못합니다. 모든 테스트 상황에서 테스트가 5 초 미만이더라도 그러한 콜백이 모든 상황에서 발생한다는 점을 알려드립니다. 취소 가능한 작업이 필요하다면 reactor.callLater를 직접 사용해야합니다. 사용할 수있는 연기는 반환하지 않지만 예약 된 호출을 취소 할 수 있습니다.

+0

답해 주셔서 감사합니다. 나는 아직도 질문을 가지고있다 :이 프로그램은 인터넷을 사용하기 때문에 .TCPServer와 다른 서비스 모듈들은 원자로가 실제 현장 뒤에 있기 때문에 만약 당신이 말한 것과 같은 원자로를 사용한다면 그것은 두 개의 원자로가 될 것인가? 내가 그걸로 무엇을합니까? – Henry

+0

원자로는 실제로 POSA2 서적에 잘 설명 된 패턴입니다. http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0471606952.html 원자로가 하나뿐입니다. Twisted에서는 Linux 환경에서 SelectReactor 나 EPollReactor를 사용하고있을 것입니다. 이러한 모듈을 처음으로 가져 오면 기본 원자로가 아직 설치되지 않은 경우이를 인스턴스화합니다 (https : // github.com/twisted/blob/trunk/src/twisted/internet/reactor.py 그래서 그것은 후드 아래에서 반응기를 사용하고 부제는 사용하지 않는 TCPServer입니다. 특정 구현이 필요할 때까지 안전하게 무시할 수 있습니다. –

관련 문제