最新バージョンの MRI では、ネイティブ スレッドと同じメリットを得るために JRuby を採用する必要がなくなりますか?
答えはノーだ。必要性を否定するものではなく、他の回答で述べたように、アプリケーションによって異なります。
また、JRuby ではクラスター モードで実行することはできませんが、マルチスレッドで並列であるため、質問に関しては実際には問題になりません。必要な数のスレッドを使用してシングル モードで実行するだけです。さらに軽量ではないにしても、それは完全に問題ないはずです。
より多くの洞察を与え、さらに掘り下げることができる参考文献をいくつか紹介しましょう。
この回答では、Puma (最大 40 スレッド) を使用して同時要求をテストする MRI および JRuby の実験について説明します。それはかなり包括的です。
実験は GitHub、MRI、およびJRubyで入手できます。
注意点は、同時リクエストのみをテストすることですが、コントローラーに競合状態がないことです。ただし、この記事のテストを実装できると思いますconfig.threadsafe を削除します! あまり努力せずに。
JRuby と MRI の違いは、JRuby がコードを並列に実行できることです。MRI は GIL によって制限されており、一度に実行できるスレッドは 1 つだけです。GIL の詳細については、この記事「誰も理解していないGIL」を参照してください。
結果は非常に驚くべきものです。MRI は JRuby よりも高速です。レース条件を自由に改善および追加してください。
どちらもマルチスレッドであり、スレッドセーフではないことに注意してください。実際の違いは、MRI はコードを並列に実行できず、JRuby はできることです。
実験で MRI の方が高速であることが示されている場合、なぜ「いいえ」と答えるかを言いたくなるかもしれません。
より多くの実験、特に実世界への応用が必要だと思います。
コードを並列実行できる JRuby の方が高速であると思われる場合は、次の理由が考えられます。
- 実験は、JRuby の可能性を活用できる高度な並列環境で実行する必要があります。
- Web サーバー自体である可能性があります。おそらく、Puma は JRuby の可能性を最大限に活用していません。MRI には GIL があるのに、なぜ JRuby よりもリクエストの処理が速いのですか?
- より詳細な他の要因が関連している可能性がありますが、まだ発見されていません...