1

asyncoreの上に構築されたサードパーティのプロトコルモジュール(SNMP)があります。asyncoreインターフェースは、応答メッセージを処理するために使用されます。asyncoreメインループの実行中にプロトコルの要求側を生成するクライアントを設計するための適切な手法は何ですか。私は今2つのオプションを考えることができます:

  1. asyncore.loop()のloop、timeoutパラメーターを使用して、クライアントプログラムが適切な要求を送信できるようにします。

  2. レシーバーと同じ非同期処理ループで実行されるクライアント非同期ディスパッチャーを作成します。

最良の選択肢は何ですか?私は2番目のソリューションに取り組んでいます。これは、プロトコルAPIが非同期パラメーターへの直接アクセスを提供しないためです。非同期を利用するための適切なテクニックを誤解した場合は、訂正してください。

4

1 に答える 1

1

レシーバープロセスの非同期ループにコールバック関数を追加することで、これを解決しました。

解決策は、私が実験したモジュール(pySNMP)にいくらか固有のものでしたが、一般的な考え方は次のとおりです。

  1. 変数への参照が格納された呼び出し可能メソッドを返す関数クロージャを定義しdictますwindowdictトラックは予想される応答を追跡し、はwindow送信者バッファーのサイズです。

  2. クロージャ関数への参照をカスタマイズされたasyncore.dispatcherインスタンスに渡します。コールバック関数は、writeableメソッド呼び出しで実行できます。

  3. ディスパッチャのタイムアウトを小さい値に設定します。これにより、受信したパケットを待機している間、非同期が長時間ブロックされるのを防ぎます。.05秒を使用しました。低くするほど、アプリの応答は高くなりますが、低くしすぎないでください。

  4. asyncore read_handleメソッドを更新して、受信した応答をグローバルdict構造から削除します。これにより、新しいメッセージを送信できるようになります。

  5. これで、ディスパッチャと非同期のすべてのループが開始され、システムはコールバック関数を呼び出し、定義されたウィンドウサイズまでメッセージを送信します。

于 2010-04-29T03:45:05.043 に答える