Pythonの作成者であるGuido Van Rossumからのこの投稿は、PythonからGILを削除する初期の試みに言及しています。
これは以前に試されましたが、残念な結果が出ました。そのため、自分で多くの努力をすることに消極的です。1999年にGreg Stein(Mark Hammond?と)がPythonのフォーク(1.5と思う)を作成し、GILを削除して、すべての可変データ構造のきめの細かいロックに置き換えました。彼はまた、私が受け入れたグローバルな可変データ構造に関する多くの依存関係を削除するパッチを提出しました。ただし、ベンチマーク後、最速のロックプリミティブ(当時のWindows)を備えたプラットフォームでも、シングルスレッドの実行がほぼ2倍遅くなることが示されました。つまり、2つのCPUで、もう少し作業ができるGILを備えた単一のCPU上よりも、GILなしで行われます。これだけでは不十分で、グレッグのパッチは忘れ去られました。(パフォーマンスに関するGregの記事を参照してください。)
私は実際の結果について議論することはできませんが、なぜこれが起こったのか本当に疑問に思います。おそらく、CPythonからGILを削除することが非常に難しい主な理由は、参照カウントメモリ管理システムのためです。典型的なPythonプログラムは何千回または何百万回も呼び出しPy_INCREF
、Py_DECREF
ロックをラップする場合の主要な競合ポイントになります。
しかし、アトミックプリミティブを追加すると、シングルスレッドプログラムの速度が低下する理由がわかりません。各Pythonオブジェクトのrefcount変数がアトミックプリミティブになるようにCPythonを変更したと仮定します。そして、参照カウントをインクリメントする必要がある場合、アトミックインクリメント(フェッチアンドアド命令)を行うだけです。これにより、Pythonの参照カウントがスレッドセーフになり、ロック競合が発生しないため、シングルスレッドアプリケーションのパフォーマンスが低下することはありません。
しかし、悲しいかな、私よりも賢い多くの人が試したり失敗したりしているので、明らかに私はここで何かを見逃しています。この問題の見方の何が問題になっていますか?