QA@IT
«質問へ戻る

質問を投稿

RubyのGILはなぜ必要なのですか?

http://www.jstorimer.com/2013/03/26/brian-shirai-threads.html

を読んでいて思ったのですが、GILは空気のような当たり前の存在になっているためか、思考停止していて、そのありがたさがわからなくなっていることに気が付きました。

単純に考えれば、せっかくRuby 1.9以降はネイティブスレッドになったのだから、GILをなくせばマルチコアを活かせるようになるので、アプリケーション設計の選択肢が大きく広がるように思えます。

また、GILのある現在でも、グローバルなステート(定数、グローバル変数、クラス変数など)やファイルアクセスなど外部リソースに対するレースコンディションは無数に存在するので、GILがあれば全て解決、というようなものでもなさそうです。

また、WikipediaのGILの項目をみても、採用している代表例はCPythonとMRI Ruby程度であり、すごく一般的に有用だと評価されているアプローチというわけでもなさそうです。

どちらかというと、GILの存在によって、マルチスレッドによる並列制御を書くことを諦めさせて、forkベースのマルチプロセスにいかざるをえないという、フィーチャー自体ではなく間接的な効能によってスレッドセーフティが達成されているような印象を受けます。

そこで改めて質問なのですが、RubyのGILはなぜ必要なのでしょうか?GILがないと、どのような場合に困るのでしょうか?

使うライブラリも含めて、スレッドセーフティに関する責任をユーザがとれると判断したのであれば、GIL.disableのようなオプションがあってもよさそうな気がするし、現場での多様性をいかした実験ができると思うのですが、そういうオプションが提供されていないのには、どのような理由があるのでしょうか?

http://www.jstorimer.com/2013/03/26/brian-shirai-threads.html

を読んでいて思ったのですが、GILは空気のような当たり前の存在になっているためか、思考停止していて、そのありがたさがわからなくなっていることに気が付きました。

単純に考えれば、せっかくRuby 1.9以降はネイティブスレッドになったのだから、GILをなくせばマルチコアを活かせるようになるので、アプリケーション設計の選択肢が大きく広がるように思えます。

また、GILのある現在でも、グローバルなステート(定数、グローバル変数、クラス変数など)やファイルアクセスなど外部リソースに対するレースコンディションは無数に存在するので、GILがあれば全て解決、というようなものでもなさそうです。

また、[WikipediaのGILの項目](http://en.wikipedia.org/wiki/Global_Interpreter_Lock)をみても、採用している代表例はCPythonとMRI Ruby程度であり、すごく一般的に有用だと評価されているアプローチというわけでもなさそうです。

どちらかというと、GILの存在によって、マルチスレッドによる並列制御を書くことを諦めさせて、forkベースのマルチプロセスにいかざるをえないという、フィーチャー自体ではなく間接的な効能によってスレッドセーフティが達成されているような印象を受けます。

そこで改めて質問なのですが、RubyのGILはなぜ必要なのでしょうか?GILがないと、どのような場合に困るのでしょうか?

使うライブラリも含めて、スレッドセーフティに関する責任をユーザがとれると判断したのであれば、`GIL.disable`のようなオプションがあってもよさそうな気がするし、現場での多様性をいかした実験ができると思うのですが、そういうオプションが提供されていないのには、どのような理由があるのでしょうか?