PythonにおけるGILグローバルインタープリタロックの実装方法と原理解析

PHPz
リリース: 2023-04-26 15:16:08
転載
1457 人が閲覧しました

1. GIL がある理由

設計者は、メモリ管理と同様の複雑な競合リスク問題 (競合状態) を回避したいと考えています

CPython は多数の C 言語ライブラリを使用するためですが、それらのほとんどの C 言語ライブラリは、ネイティブにスレッド セーフではありません (スレッド セーフはパフォーマンスを低下させ、複雑さを増大させます)

2. GIL の仕組み

複数のスレッドが実行されると、各スレッドが開始されます。 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 ... */ 
    }
}
ログイン後にコピー

3.Python のスレッド セーフ

GIL を使用する場合でも、プログラミング時にスレッド セーフを考慮する必要があります

4.GIL をバイパスするにはどうすればよいですか?

CPython をバイパスし、JPython (Java で実装された Python インタープリター) などの他の実装を使用します。

主要なパフォーマンス コードを他の言語 (通常は C) に入れて

5. CPU を集中的に使用するタスクを処理する場合、マルチスレッドがシングルスレッドよりも遅くなる場合があるのはなぜですか?

GIL はスレッドを交互に実行する仕組みを採用しています。GIL はスレッドを継続的に切り替える必要があります。スレッド数が多かったり、実行時間が長い場合、切り替えによるパフォーマンスの損失は単一スレッドの場合を超える可能性があります

6. GIL は良いデザインだと思いますか?

実は Python 3 以降、GIL の改善や廃止について多くの議論が行われていますが、皆さんはどう思いますか? 日常業務で GIL に悩まされたことはありますか?

GIL は依然として優れた設計です。パフォーマンスは低下しますが、リソースが競合しないようにしてデッドロックを防ぐという一定の役割を果たします。

以上がPythonにおけるGILグローバルインタープリタロックの実装方法と原理解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート