0

テキストベースのプロトコルを処理するために twisted を使用しています。最初に、クライアントはサーバーに接続します。接続後、サーバーはクライアントが応答するコマンドを送信します。コマンドの種類ごとに、応答を作成するのにかかる時間が異なります。(例: ローカル ハッシュから値を返すことと、大きなデータベースでの複雑な MySQL クエリから値を返すこと)。クライアントからの応答は、コマンドが受信された順序で行われる必要があります。サーバーは、別のコマンドを送信する前に 1 つのコマンドからの応答を待機しませんが、コマンドが送信された順序で応答を期待します。クライアントは、サーバーから送信されたコマンドの順序を予期できません。

以下は、私のプログラムが現在どのように動作するかの概要を示す最小限のコードです。

class ExternalListener(LineReceiver):
    def connectionMade(self):
        log.msg("Listener: New connection")

    def lookupMethod(self, command):
        return getattr(self, 'do_' + command.lower(), None)

    def lineReceived(self, verb):
        method = self.lookupMethod(verb)
        method(verb)

    def do_cmd1(self, verb):
        d = self.getResult(verb)
        d.addCallback(self._cbValidate1)

    def _cbValidate1(self):
        resp = "response"
        self.transport.write(resp)

    def do_cmd2(self, verb):
        d = self.getResult(verb)
        d.addCallback(self._cbValidate1)

    def _cbValidate2(self):
        resp = "response"
        self.transport.write(resp)

ご覧のとおり、これは応答の順序を考慮しません。DeferredList を使用する立場にはありません。なぜなら、deferred はコマンドを受信したときに作成され、DeferredList に入れることができる deferred のリストがないからです。

このシナリオを処理するねじれた方法は何ですか?

よろしくお願いいたします。

4

1 に答える 1