2010-10-03 12 views
2

J'essaie de m'enseigner une programmation Twisted rudimentaire grâce à this tutorial et beaucoup d'autres. Je suis venu à cet exemple actuel que je ne peux pas comprendre pourquoi il fait ce qu'il fait.Le réacteur s'est arrêté plus tôt que prévu?

Résumé: J'ai instancié trois réacteurs qui comptent de 5 à 1 avec différents retards dans leur comptage. La seule chose est, il semble que lorsque le premier compteur (avec le plus court délai) arrive à 0, il arrête non seulement son propre réacteur, mais tous les autres.

#!/usr/bin/env python 

class Countdown(object): 

    counter = 5 

    def count1(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...1' 
      self.counter -= 1 
      reactor.callLater(1, self.count1) 

    def count2(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...2' 
      self.counter -= 1 
      reactor.callLater(0.5, self.count2) 

    def count3(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...3' 
      self.counter -= 1 
      reactor.callLater(0.25, self.count3) 

from twisted.internet import reactor 

reactor.callWhenRunning(Countdown().count1) 
reactor.callWhenRunning(Countdown().count2) 
reactor.callWhenRunning(Countdown().count3) 

print 'Start!' 
reactor.run() 
print 'Stop!' 

Sortie

Start! 
5 ...1 
5 ...2 
5 ...3 
4 ...3 
4 ...2 
3 ...3 
2 ...3 
4 ...1 
3 ...2 
1 ...3 
Stop! 

J'avais l'impression que si les trois compteurs doivent décompter à leur propre rythme et compléter leur progression 5-> 0, le programme attendrait tous pour terminer avant de quitter Ai-je mal compris quelque chose dans les façons de Twisted ici?

Répondre

1

Je ne suis pas familier avec tordu, mais à partir de google google résultats, il semble que le réacteur est une boucle d'événement. Vous n'en avez qu'un, donc le premier compteur à frapper reactor.stop() arrête la boucle.

Pour faire ce que vous voulez, vous devez supprimer les appels reactor.stop() et les choses de la structure de sorte que lorsque la dernière minuterie arrive à la fin, et seulement elle, les appels reactor.stop()

+0

Brian, merci pour le conseil. Peut-être que je ne suis pas assez familier avec les méthodes de Twisted, mais comment pourrais-je coder un conditionnel à la recherche du «dernier timer»? J'ai pensé utiliser getDelayedCalls, mais cela ne semble fonctionner qu'avec callLater, et pas avec callWhenRunning. – jfofo

0

Il parle un peu à ce sujet dans part 3. Vous pourriez mélanger «démarrer trois réacteurs dans un serveur» et «démarrer trois serveurs différents». Les exemples suggèrent de faire le dernier; votre code tente de faire le premier. Fondamentalement, le réacteur est un singleton, et ne peut pas être redémarré une fois arrêté. Donc, vous ne pouvez en avoir qu'un par processus, ou peut-être un par thread. Au lieu de démarrer trois réacteurs, vous souhaitez configurer trois rappels temporisés différents sur le même réacteur. Ils seront tous renvoyés au moment opportun.