2010-08-18 67 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