asynchatを使うと、asyncoreを基盤とした非同期な サーバ・クライアントをより簡単に開発する事ができます。 asynchatでは、プロトコルの要素が任意の文字列で終了するか、ま たは可変長の文字列であるようなプロトコルを容易に制御できるようになってい ます。asynchatは、抽象クラスasync_chatを定義してお り、async_chatを継承してcollect_incoming_data()メソッド とfound_terminator()メソッドを実装すれば使うことができます。 async_chatとasyncoreは同じ非同期ループを使用してお り、asyncore.dispatcherもasynchat.async_chatも同じチャネ ルマップに登録する事ができます。通常、asyncore.dispatcherはサー バチャネルとして使用し、リクエストの受け付け時に asynchat.async_chatオブジェクトを生成します。
) |
asyncore.dispatcherと同様に、async_chatも select()呼出し後のソケットの状態からイベントを生成します。 ポーリングループ開始後、イベント処理フレームワークが自動的に async_chatのメソッドを呼び出しますので、プログラマが処理を記述 する必要はありません。
asyncore.dispatcherと違い、async_chatでは プロデューサの first-in-first-outキュー(fifo)を作成する事ができ ます。プロデューサはmore()メソッドを必ず持ち、このメソッドで チャネル上に送出するデータを返します。プロデューサが枯渇状態 (i.e. これ以上のデータを持たない状態)にある場合、 more()は空文字列を返します。この時、async_chatは枯渇 状態にあるプロデューサをfifoから除去し、次のプロデューサが存在すればそ のプロデューサを使用します。fifoにプロデューサが存在しない場合、 handle_write()は何もしません。リモート端点からの入力の終了や 重要な中断点を検出する場合は、set_terminator()に記述します。
async_chatのサブクラスでは、入力メソッド collect_incoming_data()とfound_terminator()を定義 し、チャネルが非同期に受信するデータを処理します。以下にメソッドの解説 を示します。
) |
None
をプッシュします。このプロデュー
サがポップされると、チャネルがクローズします。
data) |
) |
) |
) |
) |
) |
) |
data) |
producer_fifo
にプッシュして転送します。データをチャネル
に書き出すために必要なのはこれだけですが、データの暗号化やチャンク化な
どを行う場合には独自のプロデューサを使用する事もできます。
producer) |
) |
True
を返します。
) |
None
になると、チャネルはクローズされます。
term) |
term
は入力プロトコルデー
タの処理方式によって以下の3つの型の何れかを指定します。
term | 説明 |
---|---|
string | 入力ストリーム中でstringが検出された時、 found_terminator()を呼び出します。 |
integer | 指定された文字数が読み込まれた時、 found_terminator()を呼び出します。 |
None |
永久にデータを読み込みます。 |
終了条件が成立しても、その後に続くデータは、 found_terminator()の呼出し後に再びチャネルを読み込めば取得す る事ができます。
) |
True
as long as items remain on the producer fifo,
or the channel is connected and the channel's output buffer is non-empty.
プロデューサfifoが空ではないか、チャネルが接続中で出力バッファが空でな
い場合、True
を返します。