コレクション

GILとは?Pythonの並列実行参照カウントメモリ管理コレクション今後について

PythonでGILの排除が難しい理由として、参照カウントの存在に加えて、Pythonインタープリタが辞書やリストなどの複雑なコレクションに依存している、という点もよく挙げられます。

Pythonのクラスやインスタンス、グローバル変数などは辞書オブジェクトを基盤として構築されており、前述のGreg Stein氏がフリースレッド版Pythonを開発した時代には、ローカル変数も辞書を利用して管理されていました。辞書などの高度なオブジェクトはマルチスレッド環境ではロックが必須であるため、GILのない環境では大きくパフォーマンスが低下するとされています。

オブジェクト別ロック

PEP-703では、辞書オブジェクト・リストオブジェクト・セットオブジェクトにそれぞれ専用のロックオブジェクトを用意することを提案しています。オブジェクトを操作するときにはこのロックを利用します。

また、複数のオブジェクトのロックを獲得する場合、デッドロックを回避するために一貫した順序でロックを獲得する必要があります。安全にロックを獲得するために、専用のマクロが用意されています。

楽観的ロック

マルチスレッド環境では、辞書やリストを参照するときデータ競合を避けるために必ずロックを獲得する必要があります。しかし、ロックは本当に「必ず」必要でしょうか?いくらマルチスレッド環境でも、実際に他のスレッドからのアクセスがなければ、データ競合は発生しません。実際のアプリケーションでは、ロックを獲得せずにアクセスしても、データ競合が発生する確率は、発生しない確率よりも低いのです。

そこで、PEP-703では楽観的ロックを利用した高速なアクセスを提案しています。楽観的ロックは、とりあえずロックを獲得せずにアクセスしてみて、その直後にオブジェクトの状態が変化しているかどうかチェックします。状態が変化していなければ他のスレッドとのデータ競合が発生しなかったということですから、そのまま処理を継続します。状態が変化していたら、今度はきちんとロックを獲得してからもう一度アクセスし直す、という方式です。一般的なアプリケーションでは、楽観的ロックはかならずロックを獲得してからアクセスする 悲観的ロック よりも高速に動作することを期待できます。

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