【问题标题】:Twisted, Deferred Callbacks chain扭曲的延迟回调链
【发布时间】:2011-11-08 21:04:33
【问题描述】:

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

代码如下:

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 中,来自 deferred stack_shift 而不是 min_active_stack。

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

self.temp=d   

并在 min_normalization 中使用 self.temp。

但至于正确的决定呢?

【问题讨论】:

  • 为什么不能在stack_shift中添加collback?如果需要,您也可以在 addCallback 中传递参数

标签: python callback twisted deferred


【解决方案1】:

我实际上不明白这个问题。为什么不能只将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多