python - ツイストされた遅延コールバックチェーン

原文 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に対する1つの要求があります。

この場合、データはチェーンを介して送信され、それは単純です。
しかし、チェーンの途中でコールバックよりも多くを実行する必要がある場合はどうでしょうか。

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では、min_active_stackではなく据え置きのstack_shiftが原因であることがわかります。

私自身は、stack_shifttに行を追加してこの問題を解決しました。

self.temp=d   


そして、min_normalizationでself.tempを使用します。

しかし、正しい決定までは?
答え
私は実際に問題を理解していません。 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
関連記事

python - JSONからデータを読み込んだ後のメモリのクリーニング

python - クラスが定義されたときに自動登録する(ただし、どこにもインポートしない)

python - Pylonsを初めて使用し、ルートを理解しようとする

python - Pythonでの配列のすべての要素の文字列操作

python - 文字列から日時変数形式

python - Pythonでユニコード文字のリストをヘブライ文字列に変換する

python - Python executorの作成に関する問題

python - 孫ではなく子供のCPU使用率を測定する

python - 極座標プロットのエラーバーがmatplotlibの角度で回転しません

python - ユーザー定義クラスに異なる名前を使用すると、2つのPythonスクリプトの動作が異なる