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 件のコメント:
コメントを投稿