Python Gilは本当に通訳ごとに本当にありますか?
-
22-09-2019 - |
質問
ギルはPythonインタープリターごとに(ここでもStackoverflowでも)人々が話しているのをよく見ます。
しかし、ソースコードで見たのは、GILがグローバル変数であるため、各Pythonプロセスにすべての通訳者に1つのGILがあるということです。私は彼らがこれをしたことを知っています。なぜなら、LUAやTCLのように通過する通訳オブジェクトが渡されていないからです。最初はうまく設計されていませんでした。また、スレッドローカルストレージは、Pythonの人が使用するためにポータブルではないようです。
これは正しいです?ここでプロジェクトで使用している2.4バージョンを少し見ました。
これは、特に3.0で、後のバージョンで変更されましたか?
解決
ギルは確かにプロセスごとではなく、インタープレーターではありません。これは3.xで変更されていません。
他のヒント
おそらく、ほとんどの人がPythonがプロセスごとに1つのインタープリターを持っていると想定しているため、混乱は生じます。 C APIを介した複数の通訳者のサポートがほとんどテストされておらず、ほとんど使用されていなかったことを読んだことを思い出します。 (そして、私がそれを試してみたとき、正しく動作しませんでした。)
私は、各プロセスが最大で1つのcpythonインタープリターが埋め込まれている可能性があることは真実だと思います(他のランタイムには異なる制約がある場合があります)。これがギル自体の問題であるかどうかはわかりませんが、グローバルな状態によるものであるか、サードパーティCモジュールの矛盾するグローバルな状態から保護する可能性があります。から cpython APIドキュメント:
py ___ initialize()]は、2回目の呼び出された場合のNo-opです(py_finalize()first)。返品値はありません。初期化が失敗した場合、致命的なエラーです。
あなたはに興味があるかもしれません 不自由なツバメ プロジェクトは、最終的にCpythonから完全にギルを削除することを目指しています。他のPythonランタイムはギルをまったく持っていません(私は信じています) スタックレスパイソン, 、そして確かに ジャイソン.
また、ギルはそうであることに注意してください Cpython 3.xにまだ存在します.