Twisted, Deferred Callbacks цепочка - PullRequest
       11

Twisted, Deferred Callbacks цепочка

2 голосов
/ 02 сентября 2011

После прочтения документации и нескольких вариантов использования.Возник вопрос, как использовать цепочку обратных вызовов.Точнее, как передавать данные между 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 я делаю запрос к БД.В min_normalization я обрабатываю данные.И insert_db на обработанные данные у меня есть один запрос к БД.

В этом случае данные передаются по цепочке, и это просто.Но что, если в середине цепочки нужно запустить больше, чем Callback.

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   

И использовал self.temp в min_normalization,

Но насколько верное решение?

1 Ответ

2 голосов
/ 02 сентября 2011

Я на самом деле не понимаю проблемы. Почему вы не можете просто передать результат из 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
...