Python Languageグローバルインタープリタロック(GIL)を回避する


備考

なぜGILがあるのですか?

GILは1992年にPythonスレッドの開始以来、CPythonを中心に活動してきました。Pythonコードを実行するスレッドの安全性を保証するように設計されています。 GILで書かれたPythonインタプリタは、複数のネイティブスレッドがPythonバイトコードを一度に実行するのを防ぎます。これにより、プラグインはコードがスレッドセーフであることを容易に確認できます。単にGILをロックするだけで、アクティブなスレッドのみを実行できるため、コードは自動的にスレッドセーフです。

短いバージョン:GILは、どれだけのプロセッサとスレッドを持っていても、 一度に実行できるPythonインタプリタのスレッドは1つだけです。

これには使い勝手の点で多くのメリットがありますが、同様に多くの負のメリットもあります。

GILはPython言語の必要条件ではないことに注意してください。したがって、標準のPythonコードから直接GILにアクセスすることはできません。 Pythonのすべての実装がGILを使用するわけではありません。

GILを持つインタプリタ: CPython、PyPy、Cython(ただし、GILをnogil無効にすることができます)

GILを持たないインタプリタ: Jython、IronPython

GILの運営方法に関する詳細:

スレッドが実行されているとき、スレッドはGILをロックします。実行したいスレッドがGILを要求し、スレッドが使用可能になるまで待機します。バージョン3.2より前のCPythonでは、実行中のスレッドは特定の数のPython命令をチェックして、他のコードがロックを要求しているかどうかを確認します(つまり、ロックを解放してから再度要求しました)。この方法では、待機スレッドが起床する前に、ロックを解放したスレッドが再びスレッドを獲得するため、スレッドの不足が発生する傾向がありました。 3.2以降、GILをしたいスレッドはしばらくの間ロックを待機し、その時間が経過すると、実行中のスレッドを強制的に生成する共有変数を設定します。ただし、これにより実行時間が大幅に長くなる可能性があります。詳細については、dabeaz.comの下のリンクを参照してください(参照セクション内)。

スレッドがI / O操作を実行すると、CPythonは自動的にGILを解放します。イメージ処理ライブラリとnumpy number crunchingオペレーションは、処理を行う前にGILを解放します。

GILの利点

GILを使用する通訳者の場合、GILは全身性です。これは、アプリケーションの状態を保持するために使用されます。メリット:
  • GILがロックされている間、ガベージコレクション - スレッドセーフ参照カウントを変更する必要があります。 CPythonでは、garbargeコレクションはすべてGILに結びついています。これは大きなものです。もしGILを削除したいのであれば、まだ機能していなければならないものの詳細については、GILについてのpython.org wikiの記事を参照してください。
  • GILを扱うプログラマーが楽になる - すべてをロックするのは簡単ですが、簡単にコードすることができます
  • モジュールの他の言語からのインポートを容易にします。

GILの結果

GILは、あるスレッドがPythonインタプリタの内部で一度にpythonコードを実行できるようにします。つまり、厳密なPythonコードを実行するプロセスのマルチスレッド化は機能しません。 GILに対してスレッドを使用すると、単一のスレッドで実行した場合よりもスレッドのパフォーマンスが低下する可能性が高くなります。

参考文献:

https://wiki.python.org/moin/GlobalInterpreterLock - それが何をすべきかの簡単な概要、すべてのメリットに関する詳細

http://programmers.stackexchange.com/questions/186889/why-was-python-written-with-the-gil - 明確に書かれた要約

http://www.dabeaz.com/python/UnderstandingGIL.pdf - GILがどのように機能し、なぜ複数のコアで遅くなるのか

http://www.dabeaz.com/GIL/gilvis/index.html - GILがスレッドをロックする方法を示すデータの視覚化

http://jeffknupp.com/blog/2012/03/31/pythons-hardest-problem/ - GIL問題の歴史を簡単に理解する

https://jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited/ - GILの制限を回避する方法の詳細

グローバルインタープリタロック(GIL)を回避する 関連する例