Twisted,延迟回调链

2 投票
1 回答
2337 浏览
提问于 2025-04-17 01:11

在阅读了文档和一些使用案例后,我产生了一个问题:如何使用一系列的回调函数。更具体地说,就是如何在这些回调函数之间传递数据。

下面是代码:

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 里我向数据库发起请求。在 min_normalization 里我处理这些数据。而在 insert_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 中接收到的是来自 deferred stack_shift 的数据,而不是来自 min_active_stack 的数据。

我自己解决这个问题的方法是在 stack_shift 中添加了一行代码:

self.temp=d   

然后在 min_normalization 中使用 self.temp。

但这样做是否正确呢?

1 个回答

2

我其实不太明白这个问题。为什么你不能直接把min_active_stack()的结果通过stack_shift()传递给min_normalization()呢?

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

或者因为看起来你想在stack_shift中做一些异步的事情,可以用Deferred的方式来实现:

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

撰写回答