Global Interpreter Lock(GIL)あなたは誰ですか?


intro


python開発者として、GILの概念を知らないわけにはいかない.
FISUNについて知っているかどうかを聞くと、GILを詳しく説明するとそのままフィルタリングされます.(私が濾過した経験)GILは簡単にPythonはThreedを1つしか使っていないのではないでしょうか.このように答える人は多いはずですが、なぜ1つしか使わないのかと思うと、頭が痛い概念が出てきます.それらの概念と一緒に整理しましょう.

GILとは?


GILはGlobal Interpreter Lockの略で、いくつかのThreedを多く作っても一度に1つのThreedしか使えない制限です.
どうしたんですか.Javaのように、複数のhook hook、マルチ処理マルチスレッドhook hook、Pythonも早く帰り、java Cなどのコンパイル言語の近くにも付いていきます!
Pythonは性能を放棄し、開発者の利便性をつかんだ.(最近はPythonやPpyなどで速いですが、一部でCやGoからは遠いです…)
Pythonはオブジェクト向けの言語です.「オブジェクト向け」とは、私たちが生きている世界が物の形で存在することを意味し、私たちが見ている世界と私たちが見ているコードを最大限に表現するためにobjectの概念を加え、すべてのものをオブジェクトとして符号化する.もう一つ重要な概念はPythonのゴミ収集器(ゴミ収集器)の操作原理を理解する必要がある.
Cシリーズの言語は直接メモリ管理を行う.mallocに割り当てて使い切るとfreeに迷惑をかけるのは本当に気が狂います.これはゴミ収集器の代わりに、いつ配分されるか、いつ解除されるかの基準は言語によって異なります.

pythonのゴミ収集器


pythonのゴミ収集器は参照カウントを利用しています.すべてのオブジェクトは、referencecountをそれぞれの内部で計算します.
import sys

class Sample:
    def __init__(self):
        self.a = 1

>>> obj1 = Sample()
>>> sys.getrefcount(obj1)
2
sysパッケージのgetrefcountという名前のメソッドを使用すると、オブジェクトが参照するオブジェクトの参照countが返されます.
Q)一度割り当ててobj 1のみを指すのに,なぜ2を返すのか.
A) sys.getrefcountを作るときに2プラスreturnを参考にしてみましょうか?
信じない人は以下のc言語で実現されたPythonを見てpy reftallを検索して、目でその増加と減少を見て、あるいは私を信じます.
https://github.com/python/cpython/blob/main/Include/object.h
また,ループ参照に注意する.ループ参照はメモリ漏洩に関係するため重要ですが、ゴミ収集器postではありません.passです.
>>> import gc
>>> gc
<module 'gc' (built-in)>
>>> gc.get_threshold()
(700, 10, 10)
Pythonにはgcというゴミ収集器build-inメソッドがあります.
ごみ収集器の情報を取得するgc.get threshold()を選択し、値(700,10,10)を放出します.
これは(第1世代、第2世代、第3世代)です.genで歌いましょう
gen 1の標準点は700、2、3は10、10です.
すべてのオブジェクトが作成されると、アドレス値は生成1空間に送信されます.次にcountに数え、gen 1 threasshold(700)を超え、これらのオブジェクトのreferencecountが0の友达はすべて解放されます.その後、残りのオブジェクトアドレスをすべて次世代に送信し、第2世代のcountを追加します.(ここで知っておきたいのは、第2世代のオブジェクト数を計算するのではなく、第1世代を計算してfreeのcountを譲るのは、ちょっと混同されています)
3代目はgen 2が10まで蹴ってThreassholdを押すとカウントされます.
要するに、referencecountを利用して、GCで作ったものを一つ持っていくことが大切でしょう.
https://blog.winterjung.dev/2018/02/18/python-gc
上のブログは本当によく整理されていて、上のブログを参照することができます.

再びGILに戻る


今私たちは2つのことを知っています.pythonはオブジェクト向けの言語で、参照回数によってゴミ収集器が操作されます.
ここでの質問は参考回数です.マルチスレッドを同時に許可する場合は、参照回数を管理しながら共有リソースreferencecountにmutaxまたは信号量(変数にmutaxを掛けなければならない)を掛けなければなりません.では、すべてのオブジェクトにmutexを掛けますか?これはフィリピンに行って石斑魚を捕まえる様子です.それよりも、一度に1つのThreedしか使わず、Threed自体にMutexを掛ける制約がGILです.
では、Pythonは並列プログラミングができないのではないでしょうか.
はい、並列プログラミングはできませんが、擬似並列プログラミングはできます.
私たちのThreedは24時間365日帰らない.命令を受けた後、対応する処理だけをして、睡眠モードに戻ります.また、IOはPythonコードよりも操作が多く、時間がかかります.したがって,強力なアクティブキューさえあれば,「並列処理」のように「使用」できる.

outtro


これがGILに関する文章なのかGCに関する文章なのかはわかりませんが、GILを知るには共有リソースの問題、Garbage Collectorの成長方法、対象に向けた知識などの粗大なものを知る必要があります.また、スレッドを1つだけ書くことはロックされていますが、pseudoパラレルプログラムの概念を使うことは、今後のPython悪魔ターミネーターCoルーチンで重要になるので、ぜひ理解してスキップしてほしいと思います.
後でPythonの非同期プログラミングのコードの流れを理解しましょう!