Twisted
Twisted は Python で記述されたイベント駆動型のネットワークプログラミングフレームワークで、MIT License でライセンスされている。
Twisted プロジェクトはTCP、UDP、SSL/TLS、IPマルチキャスト、UNIXドメインソケットをサポートし、また、多数のプロトコル (HTTP、NNTP、IMAP、SSH、IRC、FTP など) をサポートしている。
中心的な概念
[編集]プロトコルとトランスポートの分離
[編集]Twisted は論理的なプロトコル(通常 HTTP や POP3などのストリームベースのコネクションに依存している)と、そうしたストリームベースのセマンティクス[要曖昧さ回避]をサポートした物理的なトランスポート層(ファイル、ソケット、SSL ライブラリなど)との完全な分離を目指して設計されている。論理的なプロトコルとトランスポート層との接続は、情報が論理プロトコル層に渡される最後の瞬間まで行われない。論理的なプロトコルはトランスポートレイヤのインスタンスを通知され、メッセージを送り返したり、相手の識別情報を確認したりするために使用することができる。ただし、プロトコルのコード内で、 トランスポート層にトランスポート層内の問題について問い合わせを行うことが可能である。当然ながら、トランスポート層がそのような方法をサポートしていなければプロトコルのコードは失敗する。
Deferred (遅延評価オブジェクト)
[編集]Twisted のアプリケーションモデルの中心は、Deferred (遅延) という概念である。これは一般的なデザインパターンの分野ではFutureとも呼ばれる。Deferred とは、たとえば遠隔地の相手からデータを必要とするなどの理由によりまだ結果が計算されていない値である。Deferred は通常のオブジェクトのように他に渡すことはできるが、値を問い合わせることはできない。各 Deferred はコールバックチェインをサポートしており、Deferred が値を取得すると、コールバックの結果を次の入力として、コールバックチェーンを通じた通知が行われていく。これにより Deferred の値を知ることなく扱うことができる。たとえば、Deferred がリモートの IPアドレス を 4 桁の形式で格納する文字列を返すとき、それを 32 ビットの数値に変換するようコールバックを追加することができる。Deferred のユーザーは、これを 32ビットの数値を返す Deferred として扱えるようになる。この機能、および "エラーバック" (errback; エラーハンドラーとして呼ばれるコールバック) を定義する機能により、イベントドリブンの抽象化を保ったままで、コード上は時系列に書くことを可能にしている。
スレッドのサポート
[編集]Twisted はスレッドを Deferred の入力として用いることで、生のスレッドに対する抽象化をサポートしている。すなわち、Deferred は即時に制御を返し、スレッドが終了したときに値を受け取る。メインスレッドで動作するコールバックを定義することができ、これにより複雑なロック処理の必要性を軽減させている。 データベースの呼び出しそのものも外部スレッドとして行われるが、結果はメインスレッドで発生する。
外部イベントループ
[編集]TwistedはGTK、QtやCocoa(PyObjC を介して)などの、外部のイベントループと結合することができる。これによりGUIプログラムのネットワークサポート層としてTwistedを用い、Pythonネイティブのライブラリのようにソケットごとにスレッドを持ってしまうオーバーヘッドなしに、すべてのライブラリを使うことができる。このモデルを使うと、たとえば本格的なWebサーバをGUIプログラムと同一プロセス内で結合することができる。
Twisted を使用しているアプリケーション
[編集]Twisted を用いたアプリケーションの実装で有名なものとしては、Jaiku がある。また ITA Software が開発したエア・カナダの航空券予約システムは、Twisted を広範囲にわたって使用している。[1].
関連項目
[編集]- Perl Object Environment - Perl プログラミング言語のための相当するフレームワーク
- Twisted Lore - Twisted チームが開発したドキュメント生成プログラム