9.94とデーモンデーモンスレッドの違い
1. メイン処理のためには、完了した操作が実行完了したメイン処理コードを指す
2をメインスレッドに、完成されたランは、全てのメインスレッドの実行が終了したプロセス内のすべての非デーモンスレッドを指し、メインスレッドの実行を考慮する完了詳細な説明は:1.メインプロセスをそのコードの最後には、カウント(デーモンはこの時点で回収された)を実行し終えた後、プロセスは常に非仕上げ実行サブプロセスのリサイクルの後に子プロセスの主な保護者を待つことになりますリソース(それ以外の場合は、ゾンビプロセスを生成する)、終了する、2.他の非デーモン・スレッドが実行を終了した後にメインスレッドが(デーモンスレッドがこの時点で回収される)を実行して終了したとみなさ。プロセスの最後の最後には、メインスレッド、全体のプロセスがリソースを再利用され、プロセスが非デーモンスレッドの実行が終了した後に終了することが保証されなければならないことを意味しているので。
9.95スレッドのミューテックス
スレッドインポートスレッド、ロック インポート時間 ミューテックス = ロック() X = 100 デフタスク(): グローバルX mutex.acquire() TEMP = X time.sleep( 0.1 ) X = TEMP-1 mutex.release() もし __name__ == ' __main__ ' : 開始 = time.time() T_L = [] のための I における範囲(100 ): T=スレッド(目標= タスク) t_l.append(T) t.start() のために T でT_L: t.join() プリント(' 主'、x)が #主0 プリント(time.time() -開始) #10.1311
再帰的なロックとデッドロック9.96
このスレッドはロックされた場合に走ったにmutexA = mutexB = RLOCK()、スレッドロック、カウンタープラス1を取得するには、カウンタは、他のすべてのスレッドが唯一待つことができ、その間1を、追加し続け、すべてのロックを解除するためのスレッドを待ちますカウンタが0になるまでデクリメントされていること
スレッディングインポートスレッド、ロック、RLOCK インポート時間 #mutexA =ロック() #mutexB =ロック()#デッドロック mutexA = mutexB = RLOCK() #再帰的なロック クラスMyThread(スレッド): DEF RUN(セルフ): セルフ。 F1() self.f2() DEF F1(自己): mutexA.acquire() 印刷(' %Sはロックだ'%をself.name) mutexB.acquire() 印刷(' %S Bは、ロックを得ました'%self.name) mutexB.release() mutexA.release() DEF F2(自己): mutexB.acquire() プリント(' %sの拿到了B锁'%のself.name) time.sleep( 0.1 ) mutexA.acquire() プリント(" %sの拿到了锁'%のself.name) mutexA.release() mutexB.release() もし __name__ == ' __main__ ' : のための I における範囲(10 ): T = MyThread() t.start() プリント('主」)
9.97セマフォ
プロセスのような、内蔵カウンタのセマフォ管理、我々は内蔵カウンタ-1)(取得を呼び出すたびに、(時)内蔵カウンタ+ 1放出を呼び出し、カウンタがゼロより小さくすることはできません。カウンタが0である場合、取得()ブロックしますスレッド別のスレッドがリリースを呼び出すまで()
#インポートセマフォをマルチプロセッシングから の通しインポートスレッド、セマフォ、current_thread インポート時間、ランダム SM =セマフォ(5 ) DEF go_wcを(): sm.acquire() プリント(' %sの上厕所INGの'%のcurrent_thread()のgetName(。 )) time.sleep(random.randint( 1,3 )) sm.release() もし __name__ == ' __main__ ' : のための I における範囲(23 :) T=スレッド(目標= go_wc) t.start()
プールプロセスは新しい、セマフォ、わずか4を最初から最後までのプロセスプールプール(4)は、最大4つのだけプロセスを生成することができ、完全に異なる概念ではなく、プロセス/スレッドの束を生成することですプロセス
GIL:グローバルインタープリタロックGIL、基本的にミューテックスであるPythonのプロセス内の各が、そのようなロックを持って、インタプリタの体内に巻き込まれ、同じプロセス内のすべてのスレッドが、GILロックを取得する必要がありますインタプリタのコードを実行します
インパクトはどのような結果として単一のプロセスで複数のスレッドをGILます:マルチスレッド実行順序、あなたが最初のために実行されるすべてのスレッドのために、GILをスクランブルする必要があり、GILは、権限を実行するために同等である唯一のスレッドの競合こと成功をつかむ、つまり、同時に複数のスレッドが単一のプロセスで複数のスレッドを実行しているだけで1つのプロセスが全く並列効果がないことを意味するが、同時の効果
PS:同じプロセス内の別のスレッドに分散すると、同じGILのための競争の前にのみプロセスの複数のスレッドで、GILのために競争するために行くことはありません
なぜGIL必要があります:メモリ管理CPythonのインタプリタはスレッドセーフではありません
GILの長所と短所:長所:スレッドセーフはCPythonインタプリタメモリ管理
短所:同じプロセス内のスレッドのすべて同じ瞬間に、唯一つの実行は、また、マルチスレッドCPythonのインタプリタを並列に達成することができないと言っ
カスタムミューテックスの類似点と相違点とGIL 、カスタム競争GILミューテックスプロセスの分析と、複数のスレッド:同じ:ミューテックスは異なる:GILがあるため、インタプリタにグローバルな効果を適用していますミューテックスは、ローカルの役割を定義するために、単一のプロセス内のすべてのスレッドがGILをつかむために、単一のプロセス内のスレッドの部分だけは、ミューテックスの定義から盗もうとします
効率性を検証9.101 CPythonの同時通訳
単一のプロセスで複数のスレッドを並列にすることはできません、平行でないあなたはマルチコアの利点を利用できないことを意味
あなたは、このような財務分析など、複数の計算集約型のプロセスを、使用する必要があります。IO集中的な使用は、ソケット、爬虫類、ウェブなど、マルチスレッド、マルチチェック無視できる程度のパフォーマンスの向上、でなければなりません
9.102スレッドとミューテックスコントラストGIL
GILの保護を使用すると、ロック処理を所有する必要があるユーザー自身のデータを保護するために、データの段階を説明することです
スレッディングインポートスレッド、ロック インポート時間 ミューテックス = ロック() COUNT = 0 DEF :タスク() 、株式会社参加無料COUNTの mutex.acquireは() #GILは唯一のスレッドが許可を取得するために実行されるインタプリタコードにアクセスすることができ、その後、置換インタプリタにコードを標的 TEMP = COUNTの #を実行するためのコードが、ミューテックススレッドを得ることができない、同様に待機する time.sleepを(0.1 ) COUNT = TEMPの+。1 mutex.release() IF __name__ == ' __main__ " : T_L = [] のための I で範囲(2 ): T =スレッド(ターゲット= タスク) t_l.append(T) t.start() のためにトンでT_L: t.join() 印刷(' 主'、カウント) #主2