2012-08-14 5 views
0

J'ai plusieurs questions sur le réacteur Twisted.Python torsadé: réacteur et protocole

1/Quel type d'erreur provoquerait le crash/l'arrêt/l'arrêt du réacteur? quel genre d'erreurs ne serait pas? 2/J'ai deux réacteurs, chacun fonctionnant selon un protocole différent. J'ai les protocoles A et B.

Un réacteur crée une nouvelle instance du protocole A chaque fois qu'il gère une entrée. S'il y a une erreur dans une instance du protocole A, cette erreur n'affecte que l'instance et le réacteur continue à fonctionner normalement.

L'autre réacteur n'exécute qu'une seule instance du protocole B (spécifiquement je l'utilise pour gérer les E/S standard). Il est tout simplement comme ceci:

stdio.StandardIO(ProtocolB()) 
reactor.run() 

Si une entrée donne en quelque sorte une erreur dans le protocole B, il affecte l'ensemble du réacteur. Est-ce que le réacteur s'arrête réellement dans ce cas?

3/Dans le cas du deuxième réacteur ci-dessus, est-il possible de créer une nouvelle instance du protocole B pour remplacer l'ancienne instance si une erreur est détectée?

Répondre

2

1/Quel type d'erreur provoquerait le crash/l'arrêt/l'arrêt du réacteur? que genre d'erreurs ne serait pas?

Une règle de base est: reactor jusqu'à ce que fonctionne reactor.stop() est appelé par vous ou en réponse à un événement attendu par exemple, le signal SIGINT (interruption du clavier).

Si une entrée donne en quelque sorte une erreur dans le protocole B, elle affecte le réacteur entier . Est-ce que le réacteur s'arrête réellement dans ce cas?

Non, exceptions dans votre code ne sera pas arrêter le réacteur:

import sys 
from twisted.internet import reactor, task 

def raise_exception(): 
    raise RuntimeError 
reactor.callWhenRunning(raise_exception) 

task.LoopingCall(sys.stderr.write, '.').start(.4) # heartbeat 
reactor.callLater(5, reactor.stop) # stop reactor 
reactor.run() 

2/I ont deux réacteurs, chacun exécutant un protocole différent. J'ai protocoles A et B.

Il devrait y avoir un seul réacteur quel que soit le nombre de protocoles.

3/Dans le cas du second réacteur ci-dessus, il est possible de créer une nouvelle instance de protocole B pour remplacer l'ancienne exemple, si une erreur est détectée ?

Vous pouvez mais vous ne devriez pas le faire. si connectionMade, lineReceived lever des exceptions c'est un bug et vous devriez le réparer.

Voici un exemple qui se relance après exception. C'est juste une démonstration qu'il est possible, ne pas l'utiliser dans un code réel.

from twisted.internet import reactor 
from twisted.internet.stdio import StandardIO 
from twisted.protocols.basic import LineReceiver 

prompt = ">>>> " 
class ReverseLineProtocol(LineReceiver): 
    delimiter = '\n' 

    def connectionMade(self): 
     self.sendLine("Write everything in reverse.") 
     self.transport.write(prompt) 

    def lineReceived(self, line): 
     if line == 'raise': 
      reactor.callLater(1, launch) 
      raise RuntimeError 
     self.sendLine(line[::-1]) 
     self.transport.write(prompt) 

def launch(): 
    StandardIO(ReverseLineProtocol()) 

launch() 
reactor.run() 
Questions connexes