出版

RubyとPythonの標準実装では、GIL(グローバルインタープリタロック)が使用されています。Justin JamesがGILメカニズムの主な利点と欠点について説明します。
マルチスレッドと並列処理のプロジェクトは、私にとって特別な関心事です。なぜなら、開発者としてUIデザインのような周辺的な問題ではなく、コードに集中できるからです。Rat Catcherアプリケーションを動かすMongooseエンジンを開発した際には、検索の実行速度を上げるために.NET Parallel Extensions Library (PFx)を使用しました。Mongooseは計算負荷は高くありませんが、大量のネットワークリクエストを処理するため、待機時間が長くなる可能性があります。そのため、これらのリクエストを並列処理することで、大幅なパフォーマンス向上を実現できます。
最近、MongooseエンジンをC#以外の言語で書き直すことを検討しました。既存のC#実装には非常に満足していますが、Mongooseをクラウドプロバイダーに移行することを考えており、LinuxとWindowsのクラウドサーバーの価格差が書き換えを正当化するほど大きいと感じています。PFxをサポートする2.8がリリースされたので、Monoを使用するという選択肢もありますが、この機会にPythonやRubyも試してみるのも良いだろうと思いました。その過程で、これらの言語におけるスレッドの仕組みや、それが開発者がプロジェクトでそれらを使用するかどうかの判断にどのような影響を与えるかについて少し学びました。
RubyとPythonの標準実装(それぞれMRIとCPython)では、グローバルインタプリタロック(GIL)が使用されています。GILメカニズムは、スレッドのタイムスライスとスケジューリングを実行します。その仕組みは以下のとおりです。各スレッドは一定時間GILへの排他アクセスを持ち、何らかの処理を行った後、GILを解放します。その間、他のすべてのスレッドはGILへのアクセスを待機します。GILが解放されると、ランダムに選ばれたスレッドがGILにアクセスし、実行を開始します。
このシステムには2つの大きな利点があります。1つ目は、これらの言語でスレッドを使用するコードを記述すれば、ネイティブでスレッドをサポートしていないオペレーティングシステムでも、変更を加えることなく実行できることです。2つ目は、一度に実行されるスレッドは1つだけなので、スレッドセーフでないライブラリを使用する場合でも、スレッドセーフの問題は発生しないことです。
ただし、いくつか大きな欠点もあります。最大の欠点は、複数のスレッドが同時に実行されることはないということです。アプリケーションは並列実行されているように見えるかもしれませんが、実際にはプロセスは複数のスレッドを持つことなく、1つのスレッド内で様々な処理を頻繁に実行しているだけです。これが2つ目の問題、つまり速度につながります。マルチコアマシンやマルチプロセッサマシンでは、一度に1つのスレッドしか実行されないため、速度上のメリットは得られず、コンテキストスイッチのコストによって速度が低下します。
GILの使用は、多くの場合(ほとんどの場合ではないにしても)、スレッド化されたアプリケーションにとって好ましくないアイデアとなります。幸いなことに、選択肢はあります。まず、GILは言語仕様で必須ではありません。GILを使用しない実装も存在します(JRubyやIronRubyなど)。また、RubyとPythonの両方がサポートするプロセスモデル、つまり従来のフォーク/ジョインメカニズムに簡単にフォールバックできます。異なる実装を使用したり、フォークに依存するアプリケーションを作成したりすることは理想的ではない(あるいは不可能)かもしれませんが、RubyとPythonで真の並列プログラムを実現するための代替手段が存在するのは良いことです。
J.Ja
Justin の業界関係の開示: Justin James は、製品購入ガイドの執筆に関して Spiceworks と契約を結んでいます。また、一連のブログ、チュートリアル、記事の執筆に関して Hapax が所有する OpenAmplify と契約を結んでいます。さらに、記事やサンプル コードなどの執筆に関して OutSystems と契約を結んでいます。

ジャスティン・ジェームズ
私は万能なIT人間です。IT業界で一般的な職種があれば、おそらく一度ならず、何度も経験したことがあるでしょう。プログラマー、システム管理者、データベース管理者、PC技術者/修理担当者、ヘルプデスク、ウェブマスター、ウェブデザイナー、ウェブ開発者、アプリケーション開発者、ネットワークエンジニア。どういうわけか、どれもこれも、私の中ではたらきかけているんです!