共享变量
共享变量:多个线程访问同样变量
解决方法:锁,信号灯
锁(lock):
是一个标志:表示一个线程占用一些资源
使用过程:
上锁
使用共享资源,放心地用
取消锁,释放资源
运行结果,sum并不为零,原因:资源共享
1 import threading
2 sum = 0
3 loopSum = 10000000
4 def myAdd():
5 global sum, loopSum
6 for i in range(1, loopSum):
7 sum += 1
8
9 def myMinu():
10 global sum, loopSum
11 for i in range(1, loopSum):
12 sum -= 1
13
14 if __name__ == '__main__':
15 print("Starting.......{0}".format(sum))
16
17 t1 = threading.Thread(target=myAdd(), args=())
18 t2 = threading.Thread(target=myMinu(), args=())
19
20 t1.start()
21 t2.start()
22 t1.join()
23 t2.join()
24
25 print("Done...{0}".format(sum))
加锁的代码
1 import threading
2
3 sum = 0
4 loopSum = 10000000
5
6 lock = threading.Lock()
7 def myAdd():
8 global sum, loopSum
9 for i in range(1, loopSum):
10 # 上锁
11 lock.acquire()
12 sum += 1
13 # 释放锁
14 lock.release()
15
16 def myMinu():
17 global sum, loopSum
18 for i in range(1, loopSum):
19 # 上锁
20 lock.acquire()
21 sum -= 1
22 # 释放锁
23 lock.release()
24
25 if __name__ == '__main__':
26 print("Starting.......{0}".format(sum))
27
28 t1 = threading.Thread(target=myAdd(), args=())
29 t2 = threading.Thread(target=myMinu(), args=())
30
31 t1.start()
32 t2.start()
33 t1.join()
34 t2.join()
35
36 print("Done...{0}".format(sum))
线程安全问题:
如果一个资源/变量。它对于多线程来讲。不用加锁也部队引起任何问题,则称为线程安全
线程不安全变量类型:list, set, dict
线程安全变量类型: queue
生产者消费者问题:
一个模型,可以用来搭建消息队列
queue是一个哦那个来存放变量的数据结构,特点是先进先出,内部元素排队
死锁问题:
可重入锁:
一个锁:可以被一个县城多次申请
主要解决递归调用的时候需要申请锁的情况
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+'set num to '+str(num)
print(msg)
mutex.acquire()
mutex.release()
mutex.release()
num = 0
mutex = threading.RLock() # RLock 可重入锁 此处如果使用Lock则会产生死锁
def testTh():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
testTh()