2010-08-18 42 views
5

Deferred s是在Twisted中执行异步处理的好方法。然而,就像名字所暗示的那样,它们是延迟计算,它只运行并终止一次,一次触发回调。如果我有重复计算,就像点击一个按钮一样?是否有任何类似Deferred的对象可以重复触发,每当它被触发时都调用附加到它的所有回调函数?扭曲:推迟重复触发?

+1

它的字面意思是四年,但有人给了我一个非常满意的[这里](http://stackoverflow.com/a/27996359/2419669)。 – yangmillstheory 2015-01-17 20:19:22

回答

3

我已经设置了现在。对于我有限的使用情况,它可以做我想做的事情。

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) 

有人让我知道这是否可怕。

0

什么,你可能会寻找的是defer.inlineCallbacks,它允许您使用生成器来创建Deferreds的顺序链。基本上,你可以创建一个永不结束(或有条件结束)的生成器,并从中继续生成Deferred。

inlineCallbackskrondo.com有一个很好的写法。

+0

heh真棒功能。这让我想起了Haskell的monad,有点儿。尽管如此,我不认为这是我正在寻找的东西。当它不那么晚,我会更多地考虑它 – Claudiu 2010-08-19 03:28:31