質問:あなたはロックが必要なのですか、なぜグローバルインタープリタロックを持っていますか?
A:グローバルインタプリタロックはCPythonのインタプリタ、同じ時間であり、複数のスレッドが唯一のスレッドがCPUを予定して持つことができます
これは、スレッドとCPUロックの間で、時間はGIL、データの絶対的なセキュリティが保証できない場合でも、スレッドとCPUの間を通過しました
ロックカテゴリー
1、ミューテックス
2、デッドロック
3、再帰的ロック
#グローバルインタプリタロックが、データ・セキュリティの問題が依然として発生する からスレッドインポートスレッド インポート時間 DEF 試験(): グローバルN- TEMP = N- (time.sleep 1 ) N- = TEMP - 1 N- = 10 t_li = [] のための I (5レンジ): Tは、スレッド(目標= = テスト) t_li.append(T) t.start() [t.join()のために Tを内t_li] プリント(N-) #9。
ミューテックス
#使用锁、解决了数据安全问题 からスレッドインポートスレッド、ロック インポート時間 デフ試験(ロック): lock.acquire() グローバルn個の TEMP = N time.sleepを( 1 ) N = TEMP - 1 lock.release() N = 10 ロック = ロック() t_li = [] のための I における範囲(5 ): T =スレッド(目標=試験、引数= (ロック)) t_li.append(T) t.start() [t.join( )についてT でt_li】 プリント(N) #5
デッドロック
#の科学者の麺 からスレッディングインポートロック からスレッディングインポートスレッド インポート時間 Noddle = ロック() 箸 = ロック() DEFのTEST1(名): noddle.acquire() 印刷(' %Sが得たパスタ'%の名前) #の時間。 SLEEP(2) chopsticks.acquire() 印刷(' %Sは箸を取得'%の名前を) 印刷(' %S麺'%の名称) #time.sleep(1) chopsticks.release() noddle.release() DEF TEST2(名): chopsticks.acquire() プリント(' %sの拿到筷子'%名) time.sleep( 0.3 ) noddle.acquire( ) プリント(' %sの拿到面条'%名) 、印刷(' %sの吃面'%名) noddle.release() chopsticks.release() T1 =スレッド(目標= TEST1、引数=(' トム' 、) ) t1.start() T2=スレッド(目標= TEST2、引数=(' ABC ' )) t2.start() T3 =スレッド(目標= TEST1、引数=(' ジョーカー' )) t3.start() T4 =スレッド(目標= TEST2 、引数=(' FF ' )) t4.start()
再帰的ロック
#再帰的ロック、複数の取得()は、デッドロックが生じない からスレッディングインポートRLOCK からスレッディングインポートスレッド A = RLOCK() DEF 試験(): a.acquire() a.acquire() a.acquire() 印刷(' こんにちは、世界" ) スレッド(ターゲット =テスト).start()
#の科学者たち麺再帰的なロック からスレッディングインポートRLOCK からスレッディングインポートスレッド インポート時間 Noddleは箸= = RLOCK() DEFのTEST1(名): noddle.acquire() 印刷(' %Sだパスタ'%の名前) #time.sleepを(2) chopsticks.acquire() 印刷(' %Sは箸を取得'%の名前を) 印刷(' %S麺'%の名前) #time.sleep(1) chopsticks.release() noddle.release() DEF TEST2(名): chopsticks.acquire() プリント(' %sの拿到筷子'%名) time.sleep( 0.3 ) noddle.acquire() プリント(" %sの拿到面条'%の名) 、印刷(' %sの吃面'%名) noddle.release() chopsticks.release() T1 =スレッド(目標= TEST1、引数=(' トム' )) t1.start() T2=スレッド(目標= TEST2、引数=(' ABC ' )) t2.start() T3 =スレッド(目標= TEST1、引数=(' ジョーカー' )) t3.start() T4 =スレッド(目標= TEST2 、引数=(' FF ' )) t4.start()