2010-08-18 8 views
5

Deferred s sont un excellent moyen de faire un traitement asynchrone dans Twisted. Cependant, comme leur nom l'indique, ils sont utilisés pour des calculs différés, qui ne s'exécutent et ne se terminent qu'une fois, renvoyant les rappels une seule fois. Que faire si j'ai un calcul répété, comme si un bouton était cliqué? Y a-t-il un objet similaire à Deferred qui peut déclencher à plusieurs reprises, en appelant tous les rappels qui lui sont attachés à chaque fois qu'il est déclenché?Twisted: différé qui se déclenche à plusieurs reprises?

+1

Il a littéralement été quatre ans, mais quelqu'un m'a donné un très satisfaisant [ici] (http://stackoverflow.com/a/27996359/2419669). – yangmillstheory

Répondre

3

Je l'ai configuré pour l'instant. Pour mon cas d'utilisation limité, il fait ce que je veux.

class RepeatedDeferred: 
    def __init__(self): 
     self.callbacks = [] 

     self.df = defer.Deferred() 

    def addCallback(self, callback): 
     self.callbacks.append(callback) 

     self.df.addCallback(callback) 

    def callback(self, res): 
     self.df.callback(res) 

     self.df = defer.Deferred() 
     for c in self.callbacks: 
      self.df.addCallback(c) 

Quelqu'un me fait savoir si c'est terrible.

0

Ce que vous cherchez peut-être defer.inlineCallbacks qui vous permet d'utiliser un générateur pour créer une chaîne séquentielle de différés. Essentiellement, vous pourriez simplement créer un générateur qui ne se termine jamais (ou se termine conditionnellement) et continuer à générer des reports à partir de cela.

Il y a un grand écrit sur l'utilisation inlineCallbacks à krondo.com.

+0

heh caractéristique impressionnante. me rappelle les monades à Haskell, un peu. Cependant, je ne pense pas que ce soit ce que je cherche. Je vais y penser plus quand ce n'est pas si tard – Claudiu

Questions connexes