12

GIL は Python インタープリターごとであると話している人をよく見かけます (ここでも stackoverflow でさえ)。

しかし、ソースコードで見たところ、GIL はグローバル変数であるため、各 Python プロセスのすべてのインタープリターに対して 1 つの GIL があるようです。lua や TCL のように渡されるインタープリター オブジェクトがないため、彼らがこれを行ったことはわかっています。最初は適切に設計されていませんでした。また、スレッド ローカル ストレージは、Python 関係者が使用するには移植性がないようです。

これは正しいです?ここでプロジェクトで使用している 2.4 バージョンを簡単に見てみました。

これは後のバージョン、特に 3.0 で変更されましたか?

4

3 に答える 3

3

おそらく、ほとんどの人が Python にはプロセスごとに 1 つのインタープリターがあると想定しているため、混乱が生じます。C API を介した複数のインタープリターのサポートはほとんどテストされておらず、ほとんど使用されていないことを読んだことを思い出します。(そして、試してみると、正しく動作しませんでした。)

于 2009-10-18T18:24:19.927 に答える
0

各プロセスには最大で 1 つの CPython インタープリターが組み込まれている可能性がある (他のランタイムには異なる制約がある可能性がある) ことは (少なくとも Python 2.6 の時点では) 正しいと思います。これが GIL 自体の問題かどうかはわかりませんが、グローバル状態が原因であるか、サードパーティの C モジュールで競合するグローバル状態から保護されている可能性があります。CPython API ドキュメントから:

[Py___Initialize()] は、(最初に Py_Finalize() を呼び出さずに) 2 回目の呼び出しを行うと何もしません。戻り値はありません。初期化に失敗すると、致命的なエラーになります。

最終的に CPython から GIL を完全に削除することを目指しているUnladen Swallowプロジェクトに興味があるかもしれません。他の Python ランタイムには GIL がまったくありません。たとえば、(私は信じています) Stackless PythonJythonなどです。

また、GIL はCPython 3.x にもまだ存在することに注意してください。

于 2009-10-18T16:09:25.013 に答える