設計者は、メモリ管理と同様の複雑な競合リスク問題 (競合状態) を回避したいと考えています
CPython は多数の C 言語ライブラリを使用するためですが、それらのほとんどの C 言語ライブラリは、ネイティブにスレッド セーフではありません (スレッド セーフはパフォーマンスを低下させ、複雑さを増大させます)
複数のスレッドが実行されると、各スレッドが開始されます。 GIL は、他のスレッドの実行を防ぐためにロックされます。同様に、各スレッドが実行期間を完了すると、GIL が解放されて、他のスレッドがリソースの使用を開始できるようになります。
CPython メカニズムには別のメカニズムがあります。 check_interval と呼ばれる CPython インタープリターは、スレッド GIL のロック ステータスをポーリングしてチェックします。時々、Python インタープリターは、他のスレッドが実行できるように、現在のスレッドに GIL を強制的に解放します。
for (;;) { if (--ticker < 0) { ticker = check_interval; /* Give another thread a chance */ PyThread_release_lock(interpreter_lock); /* Other threads may run now */ PyThread_acquire_lock(interpreter_lock, 1); } bytecode = *next_instr++; switch (bytecode) { /* execute the next instruction ... */ } }
主要なパフォーマンス コードを他の言語 (通常は C) に入れて
以上がPythonにおけるGILグローバルインタープリタロックの実装方法と原理解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。