1 #/ユーザ/ビン/ ENVパイソン! 2 #- * -コーディング:UTF-8 - * - 3 4 インポートDIS 5 インポートスレッド 6 からスレッドインポートロック 7合計= 0 8ロック= ロック() 9 10 11 DEF 追加します(): 12 グローバル合計 13 のグローバルロック 14 のための I における範囲(1000000 ): 15 #获取锁 16 lock.acquire() 17 合計+ = 1 18 #释放锁 19 lock.release() 20 21 22 DEF DESC(): 23 グローバル合計 24 のグローバルロック 25 のための I における範囲(1000000 ): 26 #获取锁 27 lock.acquire() 28 合計- = 1 29 #释放锁 30 lock.release() 31 32 33スレッド1 = threading.Thread(目標= 追加) 34スレッド2 = threading.Thread(目標= DESC) 35 36 thread1.start() 37 thread2.start() 38 39 40 デフADD1(A): 41 + = 1 42 43 44 デフdesc1(A): 45 - = 1 46 47 48 ""」 49 1。ロード 50 2.load 1 51 3 +。( - ) 52 给4赋值 53 ""」 54 プリント(dis.dis(ADD1)) 55 プリント(dis.dis(desc1)) 56 57 thread1.join( ) 58 thread2.join() 59 60 プリント(合計)
41 0 LOAD_FAST 0(A) 2 LOAD_CONST 1(1) 4 INPLACE_ADD 6 STORE_FAST 0(A) 8 LOAD_CONST 0(なし) 10 RETURN_VALUE なし 45 0 LOAD_FAST 0(A) 2 LOAD_CONST 1(1) 4 INPLACE_SUBTRACT 6 STORE_FAST 0(A ) 8 LOAD_CONST 0(なし) 10 RETURN_VALUEを なし C:\ユーザー\管理\ Pythonの\ imooc> Pythonのdemo.py (a)は41 0 LOAD_FAST 0 2 LOAD_CONST 1(1) 4 INPLACE_ADD 6 STORE_FAST 0(A) 8 LOAD_CONST 0(なし) 10 RETURN_VALUE なし 45 0 LOAD_FAST 0(A) 2 LOAD_CONST 1(1) 4 INPLACE_SUBTRACT 6 STORE_FAST 0(A) 8 LOAD_CONST 0(なし) 10 RETURN_VALUE なし 0 C:\ユーザー\管理\ Pythonの\ imooc> Pythonはdemo.py 41 0 LOAD_FAST 0(A) 2 LOAD_CONST 1(1) 4 INPLACE_ADDを 6 STORE_FAST 0(A) 8 LOAD_CONST 0(なし) 10 RETURN_VALUE なし 45 0 LOAD_FAST 0(A) 2 LOAD_CONST 1(1) 4 INPLACE_SUBTRACT 6 STORE_FAST 0(A) 8 LOAD_CONST 0(なし) 10 RETURN_VALUEを なし 0
1.ロックは、パフォーマンスに影響を与えます
2.ロックがデッドロックにつながります
RLOCK
1 #!/ユーザー/ binに/のenv Pythonの 2 #- * -コーディング:UTF-8 - * - 3 4 インポートスレッディング 5 #RLOCK、行の取得に何度も呼び出すことができます同じスレッドで、数に注意を払う必要があります取得および同じリリースの数 6 #スレッドまたは関連する競合間の 7 からスレッディングインポートRLOCK 。8合計= 0 。9ロック= RLOCK() 10 。11 12である DEF 追加は、(): 13である グローバル合計 14 のグローバルロック 15 のための I に範囲(1000000 ): 16 位ロックを獲得 17。 lock.acquire() 18は lock.acquire() 19。 合計+ 1 = 20である #はロックリリース 21がされている (lock.release) 22がされている (lock.release) 23である 24 25 DEFの)(DESC: 26である グローバル合計 27 地球ロック 28の ための I における範囲(1000000 ): 29の #は、ロック獲得 30 (lock.acquireを) 31はある 合計- 1 = 32 #のリリースロック 33 lock.release() 34 35 36スレッド1 = threading.Thread(目標= 追加) 37スレッド2 = threading.Thread(目標= DESC) 38 39 thread1.start() 40 thread2.start() 41 42 thread1.join() 43 thread2.join() 44 45 プリント(合計)
0