こんな記事を見つけたので気になって調べてみました。
この記事は、Pythonの開発者専用のメーリングリストに、Sam GrossというFacebookの開発者が投稿した、GILを外したCPythonの実装(nogil)の提案について書かれています。
彼は、Global interpreter lock (GIL)を外したCPythonの概念実証のための実装とメモを投稿しました。メモのリンクはこちらです。
Global Interpreter Lock (GIL) とは
Python(のReference ImplementationであるCPython)は、マルチスレッドに対応していますが、スレッドセーフティを確保するためにGIL(Global Interpretation Lock)という仕組みがあります。
複数のスレッド処理を行っても、GILの仕組みにより、Pythonの命令は一つずつ処理され同時に処理できません。計算負荷の高い処理する際に、複数のCPUコアを搭載しているマシン上でも複数のフレッドによる同時の並列処理が出来ないので、マルチスレッドの恩恵をあまり受けられません。この問題を回避する方法として、
- マルチプロセスでの並列処理を使用
- Cなどネイティブのライブラリ内でマルチスレッド化する
などの方法がありますが、1の場合異なるプロセスでデータを共有したい場合、通常メモリが共有されていないため、プロセス間通信や共有メモリの仕組みを利用することになります。しかし、大きなデータを共有するためには、プロセス間通信ではデータをシリアライズする必要があったり、共有メモリではプリミティブな型しか共有できなかったりと、いろいろと大きなデータ上での高計算負荷の処理を行うにはハードルがあります。マルチスレッドで同時並列処理が実現できればそのような問題は解決します。
Sam Grossは、そのための概念実証を投稿したというわけです。
参考:https://wiki.python.org/moin/GlobalInterpreterLock
Guido van Rossumのコメント
Pythonの生みの親Guido van Rossumが、次のビデオSamの取り組みに言及しています(29:17あたりから)。GILを取り除く試みは、直近ではLarry HasitingsがGilectomyという名のプロジェクトでGILの除去を試みたものの、元々のシングルスレッドベースのでの処理速度が著しく低下し、うまくスケールせず失敗に終わった事をコメントしています。
このビデオがそのGilectomyについてのLarryによるプレゼンです。
Larryのプレゼンでは、GILの歴史が述べられています。GILが追加されたのは92年で、Pythonが誕生して間もない頃で、30年近く経った今も本質的な設計は変わっていません。92年頃は殆どのコンピュータはシングルコアだったでしょうが、マルチコアが当たり前の今の時代にGILの制約の影響は大きいと言えます。
下記の記事ではGilectomyが事実上頓挫した事が書かれています。
Guido自身はSamの試作を深く調べた訳ではないので、成功に確証を持っているわけではなさそうですが、Larryの試みよりはより多くの時間と努力を注ぎ込んだようだと期待しているようです。
Next Step
Python Software Foundation の Developer in ResidenceであるŁukasz Langaは、下記のブログにはnogilのネクストステップについて書いています。
- Samの試作は、パフォーマンスをある程度維持しつつスケールする方法でGILを取り除くことは可能であることを実証している。
- Samの試作をすぐに3.11に取り込むことはない。CPyhonへ取り込むにはかなりの労力が必要。
- 後方互換性と移植の入念な計画が必要。移植が適切でないと判断する事もあり得る。
- nogilを取り込には様々な考慮が必要だが、メモリアロケータなど部分的には比較的早期に取り込めるかもしれない。