Twisted,Deferred Callbacks链

时间:2011-09-02 02:48:27

标签: python callback twisted deferred

阅读文档和一些用例后。问题出现了如何使用一系列回调。更准确地说,如何在回调之间传输数据

以下是代码:

d = defer.Deferred()
d.addCallback(self.min_active_stack)
d.addCallback(self.min_normalization)
d.addCallback(self.insert_db)
d.callback(0)

def min_active_stack(self,d):
    ...
    return self.dbconn.runQuery(sql_query)

def min_normalization(self,min):
    ...
    return min[0][0]+self.x

def insert_db(self,min_norm):
    ...
    return self.dbconn.runQuery(sql_query)

首先,在min_active_stack中我请求db。在min_normalization中,我处理数据。并且对已处理的数据执行insert_db,我对db有一个请求。

在这种情况下,数据通过链传输,而且很简单。 但是,如果在链中间需要运行更多的回调,那该怎么办呢。

d = defer.Deferred()
d.addCallback(self.min_active_stack)
d.addCallback(self.stack_shift)
d.addCallback(self.min_normalization)
d.addCallback(self.insert_db)
d.callback(0)

def stack_shift(self, d):
    return self.dbconn.runQuery(query)

在stack_shift中没有使用任何外部数据,但它应该在min_active_stack之后和insert_db之前运行。事实证明,min_normalization来自延迟的stack_shift而不是min_active_stack。

对于我自己,我通过在stack_shiftt中添加一行解决了这个问题:

self.temp=d   

在min_normalization中使用self.temp。

但就正确的决定而言?

1 个答案:

答案 0 :(得分:2)

我实际上不明白这个问题。为什么你不能只将min_active_stack()的结果通过stack_shift()传递给min_normalization()?

def stack_shift(res):
    # do something usefull
    return res

或者因为看起来你想在stack_shift中执行异步操作,延迟等价物:

def stack_shift(res):
    d = runQuery(query)
    d.addCallback(lambda ignored: res)
    return d