Python学习 13day__高级语法
共享变量
共享变量:多个线程访问同样变量
解决方法:锁,信号灯
锁(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()