2006年10月2日月曜日

Python Developers Camp 2006 夏 Twistedセッション

Pyhon Developers Camp 2006 夏へ参加してきたので、メモを公開。

まず1日目のセッション1つ目。

Twistedのお話

おおたにさん

Twistedって何?
 グロテスクです。
 イベント駆動型のネットワークプログラミングのフレームワーク/ライブラリ

Twistedを使っているアプリケーション
 BitTorrent
 AppleのiCal WebDAVサーバ
 Xen
 Zope3
 ほかにもいろいろある

ネットワークプログラミングのスタイル
・同期型
 ブロッキングIOを使っている
・非同期型
 ノンブロッキングIO
 select/poll
 イベント駆動

非同期型
 Connectをコールしたときに待たない
 Connectが成功したときにイベントがあがる
 ネットワークが読み書きできるとイベントがあがる

 同期型はプログラミングが簡単
 非同期型はとってもめんどくさい。とくにTwistedを使わないとめんどくさい。

めんとくさいものを使う理由
 ネットワークとCPU効率の問題
  ネットワークプログラミングはとにかく待ちが多い
  スレッド/プロセスのコンテキストの切り換えはコストがかかる
 同期型で効率を考えると→スレッドをたくさん作る
 非同期型だと1つのスレッドで複数の接続を処理できる

非同期でやりたい理由
 マルチスレッドの処理はスレッド間の同期がたいへん。人がやるプログラミングじゃない。

WebChat + AJAXの場合
・同期型
 AJAXで定期的にPolling
 AJAXで送信専用接続と受信専用接続
・非同期型
 AJAXで送信専用接続と受信専用接続(新たなデータがきた時点でレスポンスを返す)
 普通のWebサーバじゃできない

非同期の問題
 すべて1つのスレッドで行う
  重い処理があるとプログラム全体がブロックする
  重い処理はスレッドを別に作らないと効率がかえって落ちる(スレッド間の同期問題が発生してたいへん)

結論
 どちらが優れているかは一概には言えない
 どちらのプログラミングモデルを使うかは作りたいものによる
 魔法の杖は今のところない

非同期プログラミングというと
 Twisted
 標準ライブラリのasyncoreがある

標準ライブラリじゃだめなのか?
 1つの処理だけなら十分
 複数の接続+複数のプロトコルを扱うと力不足
 asyncoreはAPIが嫌い

Twistedは?
 複数の接続、複数のプロトコルを統一的に扱える
 低レベルから高レベルまでAPIが用意されていて、好みに応じて使い分けられる
 例レベルなAPIが好き

Twistedの恐ろしいところ(すごいところ)
 ネットワークはTCP/UDP/Unix Socketなどをサポート
 ファイルアクセスも非同期で処理できる
 データベースも非同期で処理できる
 Linuxならコンソール(標準入出力)まで非同期で処理できる(でもめんどくさい、お勧めしない)
 待ちが発生しそうなことはたいてい非同期で処理できる
 select/pollを使わずにWin32のイベント処理に置き換えられる

Twistedの基本
 Reactor
 Deferred

 Factory
 Protocol
 この4つがわかっていれば、ほとんどのことはできる

Reactorとは?
 イベントループ
 イベントに応じてコールバックを実行
 スケジュール管理
 select/pollだけじゃなく、Win32, GTK1,2, QTなどのevent loopなども使用可能→クライアントのGUIプログラミングと親和性が良い
 Twistedを使ってクライアントを作る場合、WindowsだとWin32のイベントループをReactorに置き換えることで既存のコードをあまりいじらずに利用できる

Deferrdeって?
 コールバック関数、エラーバック関数を複数登録
 登録したものが順次実行される

factoryとprotocol
 Factoryは接続が確率されたときにprotocolオブジェクトを作る
 protocolオブジェクトは接続中は生存。接続が終わると破棄
 protocolオブジェクトは、ネットワークに送受信されるデータのハンドリングを行う
 protocolオブジェクト間のデータの受け渡しはfactoryを介して行う

高レベルなこと
 自分でHTTPやSMTP, IRCのプロトコルを書くのはめんどう
 Twistedのサブプロジェクトが多くのプロトコルをサポートしている(ものによってできはさまざま)
 Web関係はHTTP Protocolの上にさらに独自のフレームワークが用意されている

さらに高レベルなこと
 独自のスクリプトの仕組みがある、文法はほとんどPythonと同じ
 アプリケーションのフレームワークがある。
 UnixのデーモンやWindowsのサービスに簡単にできる

おまけ
 Twistedはサーバで使える
 クライアントでも使える
 クライアントではTwistedとpy2exeとかを使えば配布が楽

質疑応答
 止めるのはどうやるのか?
 stopというメソッド?がある

 Win32がわかっているプログラマでないときつい。特に問題が起こったときにたいへん。山のようにコールバックが帰ってきてわけがわからなくなる。どうやって解決しているのか。
 どうしているんでしょうねぇ(笑)。



0 件のコメント:

コメントを投稿