[Python]Pythonサーバーメモ
thread周りもふくむ
- Pythonのthreadモジュールはpre-emptive
- clone()がつかえるんならコンテキスト切り替えのコストは大分少ないから速いんじゃない?
- GILのLock取得とかその辺の排他制御が重い?
- そもそもGILがあるってことは実質的な動作はco-operativeのようになる
- ネイティブスレッドでもco-operativeな動作なんだったら自前で管理してもいいんじゃね?
- co-operativeなスレッド絡み
- generator
- stackless python
- greenlet
- generator系はdeveloperWorksなどにも例があるのでそっち参照。multitask.py。yieldいっぱい書きたくねえ
- stackless pythonのtasklet関係。コンパイルしなおしたりめんどい。
- greenlet stacklessとは違い拡張モジュールとして提供されているのが利点。
- co-operativeなスレッドだと任意にスイッチ可能(待ちが発生するところで他に処理を譲っちゃう)
- へぼいコードを書くと全処理が止まる可能性もある。スケジューラーの実装をどうするか?
- pre-emptiveだと管理は自前じゃなくていい(?)ので楽できるって話もあるか?性能うんぬんより
- 待ちが発生しそうなところで切り替わってくれればなんでもいい。pre-emptiveではその辺が効率わるいってのが気にくわない派がどこかにいる
- I/Oはnon-blocking、アプリケーションコードはスレッド。実装はどちらでもいい気がしてきた。
- 十分な知識があればstackless python + twistedがいい。
- eventletはI/0多重化部がselectのみ。epoll/kqueueサポートがあればこっち。
- 結論、パフォーマンスを出すには十分な知識が必要。
- aio関連
- nginxはPOSIX AIO。mod_wsgiが動くらしい
その他
- jdk1.5のSelectorのデフォルトってまだselectじゃない?(JDK6からはデフォルトepollと書いてあった)
- fdがなんでも渡たせるかと思ったらそうでもなかった。(File系が渡たせない。nio2だと扱えるっぽい)