1.スレッド
1)スレッドとは何ですか
スレッドオペレーティングシステムがプロセスに含まれるスケジューリング動作の最小単位であり、スレッドは、実行の一定の流れであります
2.スレッドとプロセスとの関係
スレッドは、プロセスに存在している必要があり、プロセスがプログラムを実行するために必要なすべてのリソースを含むリソース単位であり、実行ユニットの実際のスレッドであるだけでは存在できません
いいえスレッドは、プロセスは、リソースを利用することはできませんので、少なくとも1つのスレッドが含まれているプロセスは、我々はプログラムを起動したときに、オペレーティングシステムが自分のためにこのプログラムをメインスレッドを作成し、メインスレッドと呼ばれるプログラムによってスレッドが可能終盤に、子スレッドと呼ばれる独自のスレッドを開きます
3.なぜあなたは、スレッドが必要なのですか
唯一の目的は、効率を改善することです
4.マルチスレッドの使用
1)モジュールを使用する方法
2)Threadクラスの継承、そして実行()メソッドをオーバーライド
輸入スレッド、current_threadスレッドから インポート時間 :デフタスク() 印刷( "2"、current_thread()) プリント( "子进程ランニング") time.sleep(10) 印刷( "子进程")を __name__ ==「__main__場合「: T =スレッド(ターゲット=タスク) t.start() 印刷( "主线程") プリント( "1"、current_thread()) クラスmyThread(スレッド): デフ実行します(自己): プリント(「子进程TUN ") 、M = myThread() プリント("父进程」)
5.スレッド機能
1)小さなオーバーヘッドを作成します。
2)同一のプロセスデータ内の複数のスレッドが共有することができ
3)マルチスレッド、対等な関係があるの間、親と子の関係が存在しない、PIDすべてのスレッドが同じです
#创建线程开销对比 インポートOS インポートスレッドをスレッドから インポートプロセスマルチプロセッシングから インポート時間 DEFタスク(): #印刷( "こんにちは") プリント(os.getpid())が 通過 __name__ == '__main__'の場合: st_time =時間。時間() = [] TS :範囲(100)内のiについての T =スレッド(目標=タスク) #1、T =プロセス(目標=タスク) t.start() ts.append(t)は 、TS中のTの場合: T。参加する() プリント(time.time() - st_time) プリント( "オーバー主")
6.デーモンスレッド
あなたは他のスレッドにデーモンスレッドとしてスレッドを設定することができます
特徴:スレッドの終了後にデーモンスレッドガードも終わりを迎えています
輸入スレッドスレッドから インポート時間 :DEFタスク() 印刷( "子の1running ......") time.sleep(100) 印刷( "子の1over ......") タスク2デフ(): プリントを( "子の2running ......") time.sleep(4) 印刷( "子2over ......") T =スレッド(目標=タスク) t.daemon =真 t.start() T2 =スレッド(ターゲット=タスク2) t2.start() 印刷( "主オーバー")
共有は競争を意味します
スレッドは、セキュリティの問題です、
複数のスレッドが同時に実行することができ、同じリソースへの同時アクセス後、問題があるでしょう
ソリューション:まだミューテックス
インポートスレッドをスレッドから、列挙、ロック インポート時間 数= 10 ロック=ロック() DEFタスク(): グローバル番号 lock.acquire() A =番号 time.sleep(0.1) 数= A - 1 lock.release() のために範囲でI(10): T =スレッド(目標=タスク) t.start() 列挙でtについて()[1]: #印刷(T) t.join() プリント(番号)
、current_thread、スレッドからロックのインポートスレ 「」 " デッドロック プログラムが別のスレッドによって保持されているロック、より多くのがあったとき、リソースは2つのロックを使用するために持っている必要がありますがあり プログラムが無制限に処理されます。この時間をデッドロックと呼ばれている状態、立ち往生 例: プレートと箸を食べることをしかしなど一品料理箸を保持箸別の人持っている人持っている必要があります デッドロックを回避する方法 のロックが十分以上持っていない 場合をデッドロックの問題が発生し、当事者はロックを引き渡すことを強制されなければならない 「「」 インポート時間 #プレート LOCK1 =ロック() #箸 LOCK2 =ロック() :DEF eat1() lock1.acquire() 印刷(」%Sのグラブプレートには"%current_thread()。名) (time.sleep 0.5) lock2.acquire() "。名)(current_threadの%を印刷( "%Sの箸はつかむ) (印刷(%Sは食べ始めました!「%のcurrent_thread" ).nameの)名) lock2.release() 印刷(%のcurrent_thread()名前"%sが箸置く"。) lock1.release() 印刷( "%sのダウンプレート" %のcurrent_thread()の名前。) DEF eat2(): lock2.acquire() 印刷(「%sのグラブ箸"%のcurrent_thread()。名) lock1.acquire() 印刷("プレート"%のcurrent_thread(名)つかむため%のS) を印刷("食べるために開い%のS!「%のcurrent_threadを()。名) LOCK1 .release() 印刷( "%Sダウンプレート" %のcurrent_thread()。名) lock2.release() 印刷(current_thread%を()。名"%Sは箸置く") T1 =スレッド(ターゲット= eat1) =スレッドT2を(目標= eat2) t1.start() t2.start()
RLOCKはリエントラントまたは再帰的ロックロックと呼ばれます
ロックとの唯一の違いは:同じスレッドでRロックは数回を取得実行することができますが、実行は、対応するリリースを数回獲得しなければならないスレッドがあれば
取得を行っていた、他のスレッドが実行されません取得
インポートRLOCKのスレッドから、ロック、スレッド #L =ロック() # #1 l.acquire() #プリント( "1") #l.acquire() #プリント( "2") L = RLOCK() #1 l.acquire () #印刷( "1") #1 l.acquire() #プリント( "2") DEFタスク(): l.acquire() 印刷( "子実行......") l.release() #主线程锁了一次 l.acquire() l.acquire() l.release() l.release() T1 =スレッド(目標=タスク) t1.start()
「」 " セマフォ知る ロックRLOCKは、 コードがどのように多くのスレッドが同時にアクセスするかもしれないが、今ロックすることができ 、同時に一つだけでトイレをロックロック と同時に、公衆トイレをロックするセマフォは、大勢の人々することができ 使用しますのみ同時実行制御のためにアクセス同時変更はによって引き起こされる問題を防ぐことはできません 「」「 スレッディングインポートセマフォから、スレッド のインポート時間 S =セマフォ(5) DEFタスク(): s.acquire() 印刷(」サブRUN「) (3)time.sleep を印刷( "サブオーバー") s.release() Iレンジ(10)内の場合: Tはスレッド=(目標=タスク) t.start()