1

アプリをリファクタリングする方法がわかりません。ChainedDefered について読んだことがありますが、この手法を自分の状況に適用する方法がわかりません。ポインタ/提案は大歓迎です。

サードパーティのライブラリを使用して、リアルタイムで急速に変化する外部データ ソースを監視しています。変更が検出されるたびに、ライブラリはコードでコールバック関数を呼び出します。私のコールバック関数は、データベースからデータを取得し、いくつかの処理を実行します。

class MyApp(object):
    def start(self):
        for i in range(1, 1000):
            mycallback = CallBackHandler(x, y, z)
            thirdPartyLib.subscribe(event_name + str(i), mycallback)

     reactor.start()


class CallBackHandler(object):
    def __init__(self, x, y, z):
         ....

    def getSomeDataAndDoSomething(self):
        ...

    def __call__(self)
       callLater(self.getSomeDataAndDoSomething)

問題は、イベントが非常に短い間隔で急速に発生する場合、CallBackHandler が何度も連続して呼び出される可能性があることです。これらのコールバックが多かれ少なかれ同時に実行される場合、同じ結果が生成されます。

最後のコールバックの処理が終了した場合、コールバックを起動するにはどうすればよいですか? イベントのタイムスタンプを比較する (1 秒前に発生した場合はコールバックをドロップする) か、フラグとしてグローバル変数を使用する代わりに、twisted で提供されるコンストラクトを使用してそれを達成することをお勧めします。

4

1 に答える 1

1

今後は、完全なコード サンプルを含めてください。

限られたレベルの並行性で何かを実行したい場合Deferred、Twisted には、DeferredSemaphore使用できる というクラスが含まれています。

2006 年に、Jean-Paul Calderone は、並列処理を制限する方法について素晴らしいブログ投稿を書きました

于 2013-05-20T23:03:12.093 に答える