これは、マルチスレッドの違いとマルチプロセスの簡単な概要、彼らは他のブログ検索で見ることができ、詳細な理論的な違いで始まり、ここではそれらを繰り返しません
同じプロセスの複数のスレッドの下で、共有メモリデータは、相互に動作することができる第一級および第二の複数のスレッドの間には関係がない、CPUスレッドが実行され、メインスレッドを開くデフォルトプログラム、プロセスおよび手順は、手順および関連するリソースでありますコレクション;私たちは、マルチスレッドの基礎のいくつかの簡単な説明以下、プログラムの効率を向上させる目的を達成するために複数のスレッドを使用することができますいくつかのシナリオ
シンプルなマルチスレッド
1 インポートスレッド、時間 2 3。 DEF TEST1(X): 4 (5 time.sleep ) 。5 プリント(X ** X) 。6 。7 位TEST1以下の2つのスレッドがマルチスレッド、ターゲットバックを作成するには、次の構文を使用して、この関数を呼び出す定義します関数名、引数の引数の受け渡し、タプルの形式で引数を渡す必要と 8 START_TIME = time.time() 。9 threading.ThreadのT1 =(目標= TEST1、引数=(5 )) 10 threading.ThreadのT2 =( = TEST1ターゲット、引数=(6 )) 。11 #の開始は、マルチスレッド 12をある (t1.start) 13である (t2.start) 14 END_TIME = time.time() 15= END_TIMEのTOTAL_TIME - START_TIME 16 印刷(「TWO%は時間使用するスレッドS 」%のTOTAL_TIME) #マルチスレッドの使用は、T1 t2は、待機期間の後に逆方向に行くことを継続する前に、プログラムの実行を開始しません、メインプログラムため、メインスレッドです並列に実行されるT2、T1、この操作を実行するメインプログラムが完了したT1、T2なかっ 17 18 time.sleep(6 ) 19 #の数を比較する複数のスレッドを開始するの結果は、長時間ループのために使用することができる、マルチスレッドの並列実行、そこに印刷されないことが印刷される起動シーケンス 20である ため、I でレンジ(5 ): 21である threading.ThreadのT3 =(目標= TEST1、引数= (I)) 22である t3.start() 23である time.sleep(6)。
非メインスレッドのメインスレッドを待機が実行を続行する前に終了する方法に参加します
1 #いくつかの場合には、次のプライマリスレッドデータの前に実行されるもの処理があってもよい、子スレッドが完了した後にメインスレッドを実行する必要が 2 START_TIME1 = time.time() 。3 TL = [] #のオブジェクト格納されたマルチスレッド方法に参加後ろまで 4。 ための I における範囲(5 ): 5 threading.ThreadのT4 =(目標= TEST1、引数= (I)) 。6 t4.start() 。7 tl.append(T4) 。8 のための T で TL: #は、メインスレッドを以下継続して完了した後に出席するために、サブスレッドの実行に参加し、参加するマルチスレッド。 9 t.join() 10 END_TIME1 = time.time() 。11 total_time1 = END_TIME1 - START_TIME1 12 印刷(total_time1) #実行時間は5秒程度であります
1 位どのようにノー持つ複数の子スレッドは、メインスレッドのいくつかに参加する参加した場合に対処するには???子スレッドの子スレッドの最も長い部分の終わりがメインスレッドが子スレッドに関与していない、継続して待って、まだ並列に実行されているメインのスレッドに参加します参加した後、参加 2を T5 = threading.Thread(対象= TEST1、引数=(5 、)) 3 threading.ThreadのT6 =(目標= TEST1、引数=(6 )) 。4 t5.start() 。5 t6.start() 。6 t5_join_start_time = time.time() 。7 t5.join() 。8 time.sleep(10 ) 。9 t5_join_end_time = time.time() 10 印刷(" T5参加時間%Sは"%(t5_join_end_time - t5_join_start_time)) #実際の消費15S
デーモンスレッドsetDeamon
1つの #のも正常メインスレッドが未完成のプログラムを完了するために、他のスレッドが終了していない場合、あなたはすべてのを待つ必要があります終了した参加追加することなく、また、他のスレッドが終了するのを待たずに、すぐに終わった他のすべてのスレッドのメインスレッドの終了後に、あるデーモン、スレッドが最後にメインプログラムと同様のプログラムの終了、前に終了したデフォルトはあり参加 2 DEFのTEST1(X-): 3 time.sleep(5 ) 4 印刷(「I他のスレッド」、X - ** X-) 5 6の ために私にレンジ(5 ): 7 threading.ThreadのT =(対象= TEST1、引数= (I)) 。8 t.setDaemon(真) 。9 t.start() 10 。11 印刷(" メインスレッドが行われている")#プログラム全体が終了するデーモンスレッドの印刷動作が完了したため、直接終了を待ちません
再帰的ロックRLOCK
1つの #再帰的ロック、ロックの内側にネストロック、ロックあなたは再帰を使用しない場合は、ロック・ロジック・エラーを解放するために導くことができ、プログラム全体は横に大きく逸れてしまった;再帰的なロックプログラムを使用すると、ロックを確保するために、データ構造のロックを解除するロックが解除される維持問題なし 2ロック= threading.Lockの() 。3 DEFのTEST2(): 4 lock.acquire() 。5 プリント(" これはTEST2 IS " ) 6。 lock.release() 7。 8。 DEF Test3は(): 9 lock.acquire () 10 プリント(" 本Test3はIS " ) 。11 lock.release() 12は、 13である DEF TEST4(): 14 lock.acquire() 15 TEST2() 16 プリント(" 本TEST4 IS " ) 。17 Test3は() 18れる lock.release() 。19 20 threading.Thread =(目標=のrlock_test TEST4) 21である (rlock_test.start) 22は 23である 一方 threading.active_count()!= 1 : 24 の印刷は、(「現在のカウントがスレッドである」、threading.active_count()) #プログラム全体は二つのスレッドで印刷された、全体のプログラムを終了することができない非営巣ロック問題の原因のメインスレッドが立ち往生 25 time.sleep (1)
ロック= threading.Lock()は、プログラム全体が正常に終了することができるロックに修正= threading.RLock();正常終了出力は、以下
TEST2これは
、これはTEST4ある
現在のスレッド数が2である
、これはTEST3です