2011-09-02 4 views
2

설명서 및 몇 가지 유스 케이스를 읽은 후. 콜백 체인을 사용하는 방법에 대한 의문이 제기되었습니다.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) 

우선은 dB로 요청을 min_active_stack에 : 더 정확하게 여기

콜백

사이에서 데이터를 전송하는 방법을 코드입니다. min_normalization에서 데이터를 처리합니다. 그리고 insert_db는 처리 된 데이터에 db에 대해 하나의 요청을합니다.

이 경우 체인을 통해 데이터가 전송되므로 간단합니다. 그러나 체인의 중간에 콜백을 실행해야한다면 어떻게 될까요? stack_shift에서

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) 

는 외부 데이터를 사용하지 않는,하지만 min_active_stack 후 insert_db하기 전에 실행해야합니다. min_normalization은 min_active_stack 대신에 지연된 stack_shift에서 오는 것으로 밝혀졌습니다.

자신을 위해, 나는 stack_shiftt에 한 줄을 추가하여이 문제를 해결 : min_normalization에서

self.temp=d 

및 사용 self.temp을.

그러나 올바른 결정은 무엇입니까?

+0

가 왜 stack_shift에 collback을 추가 할 수 없습니다? 필요한 경우 addCallback에서 인수를 전달할 수도 있습니다. – varela

답변

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