0

ユーザーのネットワーク接続が に組み込まれている非同期コアに基づくネットワーク クライアントがありますDispatcher。目標は、対話型端末から作業しているユーザーがネットワーク要求コマンドを入力できるようにすることです。このコマンドはサーバーに送信され、最終的に応答が返されます。クライアントは非同期に記述されているため、ユーザーは異なるサーバーで一度に複数の要求を開始し、結果が利用可能になったときに収集できます。

選択ループを回っているときに、ユーザーがコマンドを入力できるようにするにはどうすればよいでしょうか? 読み取り可能としてのみ登録された呼び出しをヒットするselect()と、データを読み取るかタイムアウトするまでそこに留まります。この (場合によっては非常に長い) 間、ユーザー入力は無視されます。代わりに、常に書き込み可能として登録すると、ホット ループが発生します。

1 つの悪い解決策は次のとおりです。独自のスレッドで選択ループを実行し、Dispatcher で定義したメソッドを呼び出して、スレッド セーフな書き込みキューにユーザーが入力を挿入できるようにします。何かのようなもの

def myConnection.enqueue(self, someData):
    self.lock.acquire()
    self.queue.put(someData)
    self.lock.release()

次に、キューが空でない場合にのみ書き込み可能として登録します

def writable(self):
    return not self.queue.is_empty()

select()次に、ヒューマン スケールでは短く、コンピュータでは長いタイムアウトを指定します。このようselectに、ユーザーが新しいデータを入力したときに読み取り専用に登録された呼び出しにいる場合、最終的にループが再び実行され、書き込む新しいデータがあることがわかります。ただし、サーバーのクライアント接続にもこのコードを使用する可能性があるため、これは悪い解決策ですselect()。繰り返しますが、これは悪い解決策です。

select正しい解決策は、ファイル記述子を介してユーザー入力を取り込み、読み取り可能としてのみ登録された呼び出しに座っている間に新しい入力を検出できるようにすることです。これを行う方法はありますか?

注:これは、ここに投稿された質問を単純化する試みです

4

1 に答える 1

0

stdin が選択可能です。stdin をディスパッチャに入れます。

また、イベント駆動型ソフトウェアの将来の開発にはTwistedをお勧めします。非同期コアよりもはるかに機能が豊富で、ドキュメントが優れており、コミュニティが大きく、パフォーマンスが優れています。

于 2013-05-31T19:54:31.473 に答える