Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonグローバルインタープリターロック(GIL)とは何ですか


この記事では、Pythonグローバルインタープリターロック(GIL)とは何ですか。

これは、Pythonインタープリターの可用性を複数のスレッドに同時に抵抗するロックまたは障害です。 GILは、Python3.xの障害/問題として識別されます。または、マルチスレッドアーキテクチャではマルチスレッドが許可されていないため、以前のバージョンです。

なぜ導入されたのですか?

Pythonは、自動ガベージコレクションの概念をサポートしています。オブジェクトの参照カウントがゼロに達するとすぐに、メモリがクリーンアップされ、使用できるようになります。

>>> import sys
>>> var = {}
>>> print(sys.getrefcount(ar))
>>> 2
>>> v=var
>>> print(sys.getrefcount(v))
>>> 3

この場合、参照カウントが減少し、同時に増加し始めると、自動コレクターが正しく機能しなくなるため、メモリリークが発生する可能性が高くなります。

このリスクを減らすために、GILはPythonで導入されました。グローバルロックを追加することは、各変数にロックを追加するよりも優れていると見なされ、デッドロックにつながる一連のロックが発生します。

Pythonグローバルインタープリターロック(GIL)とは何ですか

GILがPythonにまだ存在する理由

GILをより適切に処理できるように、GILを改善する必要があります。そのため、GILを削除する代わりに、GILの概念の改善に取り組んでいます。 pythonはcおよびcpythonのベースと純粋にリンクされているため、Gilを直接削除することはできません。解決するGILが実装するのが難しい問題を処理するためのさまざまな方法がありますが、システムの処理と実行時間を短縮します。

例:

プロセスP1がスレッドt1とt2を持っていると仮定しましょう。本質的にネイティブであるPythonスレッドは、基盤となるオペレーティングシステムによってスケジュールされます。

t1実行中(実行ステージ)(GILを取得)→t1がI / O(入力/出力)を待機中(GILを解放)→t2実行中(実行ステージ)(GILを取得、この時点でt1も実行可能ですが、GILが取得されますt2までに)

したがって、ここではGILが主要な制限になります。したがって、CPUにバインドされた重い操作を実行するマルチスレッドのPythonアプリケーション/モジュールを作成する場合、目的の結果を得ることができなくなります。

Pythonでは実際のマルチスレッド化は不可能であるため、マルチコアCPUが使用可能な場合でも、プロセスは一度に1つのCPUのみを効果的に使用します。

ただし、ほとんどのPythonアプリケーション(Webアプリケーション、Djangoベースのサーバーなど)では、これらのアプリケーションは本質的にI / Oに制限されているため、これは問題になりません。

Pythonプログラマーとして、Pythonで実行可能なC / C ++モジュール/スクリプトを作成するまで、GILの取得とリリースに対処する必要はありません

結論

この記事では、Pythonグローバルインタープリターロック、その重要性、およびPythonから直接削除できない理由について学びました。


  1. Python関数名で許可されている文字は何ですか?

    Python識別子 識別子は、Pythonでクラス、関数、変数などのエンティティに付けられた名前です。あるエンティティを別のエンティティから知るのに役立ちます。 識別子を書き込むためのルール 識別子は、小文字(aからz)または大文字(AからZ)または数字(0から9)またはアンダースコア(_)の組み合わせにすることができます。 myClass、var_3、print_to_screenなどの名前はすべて有効な例です。 識別子を数字で始めることはできません。 2variableは無効ですが、variable2は完全に正しいです。 キーワードを識別子として使用することはできません。 「

  2. Pythonのグローバル変数とローカル変数の違いは何ですか?

    グローバル変数は、グローバルにアクセスできる変数です。ローカル変数は、単一の関数定義で使用される一時変数など、現在のスコープにのみアクセスできる変数です。 例 指定されたコード内 q = "I love coffee" # global variable def f():     p = "Me Tarzan, You Jane." # local variable     print p  f() print q 出力 出力は次のとおりです Me Tarzan, You Jane. I love cof