【10.4】线程同步--Lock、RLock
生活随笔
收集整理的這篇文章主要介紹了
【10.4】线程同步--Lock、RLock
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 #!/user/bin/env python
2 # -*- coding:utf-8 -*-
3
4 import dis
5 import threading
6 from threading import Lock
7 total = 0
8 lock = Lock()
9
10
11 def add():
12 global total
13 global lock
14 for i in range(1000000):
15 # 獲取鎖
16 lock.acquire()
17 total += 1
18 # 釋放鎖
19 lock.release()
20
21
22 def desc():
23 global total
24 global lock
25 for i in range(1000000):
26 # 獲取鎖
27 lock.acquire()
28 total -= 1
29 # 釋放鎖
30 lock.release()
31
32
33 thread1 = threading.Thread(target=add)
34 thread2 = threading.Thread(target=desc)
35
36 thread1.start()
37 thread2.start()
38
39
40 def add1(a):
41 a += 1
42
43
44 def desc1(a):
45 a -= 1
46
47
48 """
49 1.load a
50 2.load 1
51 3.+(-)
52 4.賦值給a
53 """
54 print(dis.dis(add1))
55 print(dis.dis(desc1))
56
57 thread1.join()
58 thread2.join()
59
60 print(total) 41 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_ADD6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
None45 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_SUBTRACT6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
NoneC:\Users\Administrator\Python\imooc>python demo.py41 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_ADD6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
None45 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_SUBTRACT6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
None
0C:\Users\Administrator\Python\imooc>python demo.py41 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_ADD6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
None45 0 LOAD_FAST 0 (a)2 LOAD_CONST 1 (1)4 INPLACE_SUBTRACT6 STORE_FAST 0 (a)8 LOAD_CONST 0 (None)10 RETURN_VALUE
None
0
?
1.用鎖會影響性能
2.鎖會引起死鎖
?
RLock
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import threading 5 # RLock,在同一個線程里面,可以連續調用多次acquire,一定要注意acquire的次數要和release的次數相等 6 # 線程間還是有相互競爭的關系 7 from threading import RLock 8 total = 0 9 lock = RLock() 10 11 12 def add(): 13 global total 14 global lock 15 for i in range(1000000): 16 # 獲取鎖 17 lock.acquire() 18 lock.acquire() 19 total += 1 20 # 釋放鎖 21 lock.release() 22 lock.release() 23 24 25 def desc(): 26 global total 27 global lock 28 for i in range(1000000): 29 # 獲取鎖 30 lock.acquire() 31 total -= 1 32 # 釋放鎖 33 lock.release() 34 35 36 thread1 = threading.Thread(target=add) 37 thread2 = threading.Thread(target=desc) 38 39 thread1.start() 40 thread2.start() 41 42 thread1.join() 43 thread2.join() 44 45 print(total) 0?
轉載于:https://www.cnblogs.com/zydeboke/p/11298248.html
總結
以上是生活随笔為你收集整理的【10.4】线程同步--Lock、RLock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I-string_2019牛客暑期多校训
- 下一篇: TCP协议三步挥手与四步挥手