Railsのどこがスレッドセーフでないのか
今まで、自分の書いているコードがスレッドセーフかどうかなど気にしたことがありませんでした。単に、必要がなかったからです。
が、Railsがスレッドセーフになるというニュースを読んだり、MongrelやRackについて調べたりしているうちに、こりゃオレオレフレームワークはマルチスレッドに対応させないとやばいぞ、という焦りがこみあげてきました。やばいよやばいよ。
とはいえ、何をどうすればスレッドセーフになるのか、まったく分かりません。そこで、スレッドの競合について詳しく書かれているという『オブジェクト指向スクリプト言語 Ruby』を入手、読んでみました。が、それでも良くわからない。
そもそも、Railsのどこがスレッドアンセーフなのか。明解に書かれたリソースをいくら探しても見つからない。見つかったのは、Mongrelの作者・Zed Shawのメールぐらい。でも、そのメールの内容も、Railsのコア開発者・Michael Koziarskiに「誇張表現がある」とつっこまれていたりする。もう、わけがわかりません><
結局、リンク先2件の情報を照らし合わせると、DB接続周りとautoload周りがアンセーフってことなのかなあ。DBについては、他の共用リソース同様、クリティカルセクションをMutexなんかで保護する、autoloadについては、面倒がらずにすべてrequireに変える、ということで良いのかしら?
蛇足ですが、スレッドセーフに関する知識のないRails開発者がもしいたとしたら、Railsがスレッドセーフになっても恩恵にあずかれないどころか、スレッドアンセーフなコードをマルチスレッド環境で運用するようなことにならないか、ちょっと心配です。
追記(2008-08-31)
スレッドセーフRailsは、随所に入っている荒いロック処理を最低限必要とされる部分だけの最小ロックに変換したものになる。
http://journal.mycom.co.jp/news/2008/08/18/019/index.html
荒かろうが、保護されるべき箇所がロックされているのなら、すでにスレッドセーフだと思うんだけど…。ならマルチスレッド環境で運用しても問題ないはずだよなあ。MongrelがわざわざシングルスレッドでRailsを実行しているのは、スレッドアンセーフだからじゃなかったの?
「ロック処理を必要最小限にすること」を「スレッドセーフ化」と呼んでいるだけなのか、スレッドアンセーフな箇所をスレッドセーフにすることを含めて「スレッドセーフ化」と呼んでいるのか、さっぱりわかりません。みんな理解できてるのかなあ。やばいよやばいよ。