読者です 読者をやめる 読者になる 読者になる

Inside Python GIL

Pythonインタプリタのスレッド周りはどうなっているのかなぁと気になり始めて、pythonドキュメントの該当しそうな部分とか、mod_pythonの仕組みとかmod_wsgiの仕組みとか調べていた。というのも、Erlangサーバ上で動くPython処理系なんかがあればいいなぁと妄想していました。いずれも、基本的にはMPMだろうが何だろうがサブインタプリタをリクエスト毎に作って破棄する、というようなノリでした。そりゃあ遅そうだ…と思い、Tornadoなんかはそこを解決しているんだろうけど、シンプル過ぎて泣けるとかそういうことを思っていました*1。んで、なんかやってみようかなぁと思っていたのです。で、pthread上でPythonを並列で動かしたらどうなるだろうなぁ、GILとかあるし、threadingモジュールはOSの機能を使うって書いてあるからpthreadでマルチコア使ってくれるのかなぁ、でもGIL(Global Interpreter Lock)の仕様がイマイチ不明で、Erlang VMに組み込んだときにpthread_mutex_lockとかで上手く止められるんだろか、というのが疑問になっていました。
そんなところに、@akitadaのpostがあったわけです。リンク先はdabeazとかいう人がどこぞでやったらしいプレゼンテーションなのですが、Python GILの大体の仕組みや問題点を解説しています。つまり、CPU boundな処理ではGILはロックしたままで、ブロッキングI/Oのところで、周りのスレッドをブロックしてはいけないとGILを解放するわけです。詳しい絵はプレゼンテーションの資料(PDF注意)をご覧ください。分かりやすいです。ああ、Apache MPMを前提にしているからマルチスレッドで動く必要なんてないのかと得心したわけであります。Python FAQでも同じことが答えられています*2
じゃあ、次の疑問; Python処理系で動くTornadoはGILから逃れられないわけだから、マルチコア性能はかなり低い??

*1:そういえばepollとか直システムコール使ってるのになんでGAEで動いたのか謎

*2:ソースはやっぱり[http://twitter.com/akitada/status/4053048051:title=@akitada]