eventlet
eventletを少し調べてみた。意外にいい。
- twistedよりも軽量(コード量などが)
- コルーチン生成にgreenletを使用。自前のスタックを使っての継続処理
- コルーチンで協調スレッド(co-operate)を実現
- socketメソッド、sleepでコンテキストスイッチが発生し、他に処理を譲る(待ちが発生するところでスイッチする)
- I/O多重化部はselect,poll,libevent(pyevent)から選べる。pyeventがあればそれを優先
- mod_wsgiブリッジを持つ。wsgiに対応してればうごかせる。(但し、DBを使ってるとその処理でブロックする。DB処理もeventlet風に修正する)
- twistedサポートがある。EventReactorをインストールできる
- nginxサポートがある。フロントエンドにnginxを使用
- backdoor。python interpreter sevrer。socketでpythonコードを送り、結果を受けとれる
- 通常のthreadingを使用したthread poolを持つ。元々あったブロックコードはこれを使うことで並列化できる
twistedとほぼ同じことができる感じだが、コードの書き方に大きな違いがある。
twistedではDeferredを使ったcallbackスタイルになるが、eventletではシンプルに記述できる。
callbackスタイルの欠点は処理がどのような順番で処理されているかが把握しにくくなる点だが、それをうまく補っている。協調スレッドのなせる技か。
pyeventの出来はどうなのかわからないが、libeventが使えるならそれなりにパフォーマンスが出そうな感じ。
pyeventのビルドがMacでとおらなかったんだけどselectでも少し評価してみるかな。