Python3.12の新機能 Python 3.12の新機能(その5) PEP 684: インタープリター別GIL

PEP 701: f文字列の形式定義PEP 695: 型パラメータ文法その他の型ヒント関連機能PEP 688: バッファープロトコルをPythonで利用可能にPEP 684: インタープリター別GILPEP 683: 固定参照カウントによる永続オブジェクトPEP 709: 内包式のインライン化

Python3.11で開始された Faster CPython: CPython 高速化計画ですが、予定されていた Tracing optimizerが追加されなかったこともあり、残念ながらPython3.12では大きなパフォーマンスの改善は見られませんでした。

しかし、将来の高速化に向けて、大きな機能追加がありました。

サブインタープリター

Pythonのあまり知られていない機能に、サブインタープリター があります。これは一つのプロセス内で複数のPython実行環境を作成し、複数のアプリケーションを同時に動かすことができる機能です。しかし、現実にはサブインタープリター環境では正常に動作しない拡張モジュールが多く存在し、アプリケーションの開発が困難で、あまり利用されていません。

さらに、複数のインタープリターを作成しても、Pythonの実行時制限により、複数のインタープリターを同時に実行することはできず、一つづつ順番に実行されます。複数のインタープリターを作成しても、同時には実行されないため、処理効率は向上しません。この、Pythonプログラムを同時に実行しないように制御する仕組みを、Pythonの 「グローバル・インタプリタ・ロック(GIL)」 といいます。

GILについては、PEP 703 グローバル・インタプリタ・ロックを除去可能に: GILとは で詳しく解説しています。

インタープリター別GIL

PEP 684: インタープリター別GIL では、それぞれのインタープリターが専用のGILを使うように変更し、複数のインタープリタを異なるスレッドで同時に実行することができるようなりました。これまでのPythonではGILの制限のため、マルチスレッド環境であっても複数のPythonの処理を同時に実行できませんでした。これまでのPythonでは常に一つだけのCPUしか利用できませんでしたが、複数のCPUを利用してより効率的に処理を実行できるようになったのです。

しかし、現在のPython3.12で実際にサブインタープリターを使ったアプリケーションを開発するのは、まだ現実的ではありません。これは以下の理由によります。

1. Python言語でサブインタープリターを作成できない

現在、サブインタープリターはPython C APIを使わなければ作成できず、Python言語から利用することはできません。この問題は、Python3.13で追加されるPEP 734 – Stdlibにマルチプルインタープリターを追加 で解消する予定です。PEP734では、サブインタープリターの作成や、インタープリター間で通信をおこなうためのキューなどの機能が提供される予定です。

2. 拡張モジュールのサポートが不十分

公式ライブラリやPython言語だけで開発できる場合は問題ありませんが、現在利用されているサードパーティの拡張モジュールは、複数のインタープリターで同時にロードされることを想定しておらず、サブインタープリター環境では動作しないものが多く存在します。数値演算で利用されるNumpyやScipy、Pandasなどもまだサブインタープリターをサポートしていません。

公式ドキュメントの拡張モジュールの分離 でサブインタープリター環境で動作するためのガイドラインが紹介されていますが、あまり広く知られているとは言えません。すくなくともPython3.13がリリースされるまでは、拡張モジュールの対応はあまり進まないのではないかと感じています。

インタープリター別GIL と NoGIL

現在、PythonからGILを除去する PEP 703 – Making the Global Interpreter Lock Optional in CPython の開発が進められており、将来のPythonではGILが不要になるかもしれません。それでは、サブインタープリターを使ってマルチスレッドアプリケーションを開発するのは時間の無駄になるのではないでしょうか?

NoGIL版Pythonの開発は精力的に進められていますが、技術的なハードルはかなり高く、一般のアプリケーションの開発に使えるようになるのはまだまだ先だと見られています。また、NoGIL環境では拡張モジュールもマルチスレッド環境で正常に動作することを求められるため、サードパーティの対応にはそれなりの時間がかかるはずです。

一方、サブインタープリターはPython3.13で実用段階に達し、未対応な拡張モジュールを使う必要がなければすぐに利用できます。拡張モジュールの対応もNoGIL対応よりは簡単で、ガイドラインも明確になっています。また、サブインタープリターは、将来のNoGIL環境でも問題なく動くはずですので、無駄にはなりません。個人的には、サブインタープリターを利用した開発は、今後広く利用されていくのではないかと予想しています。

Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索