上一节 我们讲了 避免并发的问题,可以用轮询的方法可以解决。
但是有个缺点就是用死循环浪费CPU. 针对这样的问题,python 设计了 互斥锁
把代码改下:
import threading ,time
def work1():
global num
mutex.acquire() # 上锁
for i in range(100000):
num += 1
mutex.release() # 开锁
print("work"+str(num) )
def work2():
global num
mutex.acquire() # 上锁
for i in range(100000):
num += 1
mutex.release() #释放
print("work2 %s"%num)
if __name__=='__main__':
mutex=threading.Lock() # 创建一个锁对象
num=0
t1 = threading.Thread(target=work1)
t1.start() #线程1 运行
t2 = threading.Thread(target=work2)
t2.start() # 线程2 运行
执行过程是 :
当谁拿到这个锁 就锁住,其他线程一看是锁住了, 就需要等待, 当执行完成 就把锁释放, 其他线程就开始争取锁控制权,
拿到锁控制权后,就开始锁住。
控制一个线程执行,其他线程进行等待 锁释放