2010-08-02 4 views
3

Peut-on utiliser différée (http://twistedmatrix.com/documents/current/core/howto/defer.html) pour créer une boucle d'appel infinie dans laquelle une fonction s'ajoute à une chaîne différée? J'ai essayé de faire ceci, mais cela ne fonctionne pas:Utilisation différée pour créer une boucle d'appel infinie

d = deferred.Deferred() 
first = True 

def loopPrinting(dump): 
    ch = chr(random.randint(97, 122)) 
    print ch 
    global d, first 
    d.addCallback(loopPrinting) 
    if first: 
    d.callback('a') 
    first = False 
    return d 

loopPrinting('a') 

reactor.run() 

Répondre

5

Ceci n'est pas un bon usage pour les différés. Au lieu de cela, essayez d'utiliser reactor.callLater:

from twisted.internet import reactor 

def loopPrinting(): 
    print chr(random.randint(97, 122)) 
    reactor.callLater(1.0, loopPrinting) 

loopPrinting() 
reactor.run() 

Ou twisted.internet.task.LoopingCall:

from twisted.internet import task, reactor 

def loopPrinting(): 
    print chr(random.randint(97, 122)) 

loop = task.LoopingCall(loopPrinting) 
loop.start(1.0) 
reactor.run() 

Votre version en différé a un problème de couple. Tout d'abord, il définit un rappel sur un différé qui renvoie le même différé. Renvoyer un différé (appelons-le a) à partir d'un rappel sur un autre différé (appelons-le b) fait quelque chose appelé "chaînage". Il fait b mettre en pause sa chaîne de rappel jusqu'à ce que a ait un résultat. Dans le cas où a et b sont réellement la même instance différée, cela n'a pas ou peu de sens. Deuxièmement, lors de l'ajout d'un rappel à un différé qui a déjà un résultat, le rappel sera appelé immédiatement. Dans votre cas, votre rappel ajoute un autre rappel. Et ce rappel ajoute un autre rappel. Vous avez donc une boucle infinie tout à l'intérieur de votre ligne d.addCallback(loopPrinting). Cela empêchera le réacteur de fonctionner, brisant toute autre partie de votre programme.

+0

J'essayais d'éviter callLater dans mon code, ou une autre méthode basée sur le temps. J'essaye de faire une chaîne de fonctions dans laquelle on sera exécuté après que le précédent soit fait, ainsi le fonctionnement de la chaîne sera indépendant du temps. Existe-t-il un moyen de faire cela? – Thien

+1

pour f dans [f1, f2, f3]): f() –