python 多线程 锁Lock
在上次讲gil锁的时候(地址https://blog.csdn.net/weixin_41978134/article/details/100097159 ),
有讲到gil锁也会有释放的时候,就会导致数据的错误读存取,10万次左右可能不会有影响,然而量级大上去,结果就不再是零了。那么如何解决这种问题呢?
这里引入Lock
from threading import Lock
a = 0
lock = Lock()
def add_fun():
global a
global lock
for i in range(1000000):
lock.acquire()
a += 1
lock.release()
def desc_fun():
global a
for i in range(1000000):
lock.acquire()
a -= 1
lock.release()
import threading
t1 = threading.Thread(target=add_fun)
t2 = threading.Thread(target=desc_fun)
t1.start()
t2.start()
t1.join() # join: 主线程等待全部子线程结束才完成自己的任务
t2.join()
print(a) # 运行结果0
如果在线程中加入Lock锁,结果为0,无论数量级达到多大,他都不会导致线程数据读存取错误。但是,这也同样影响到了性能,而且,lock在同一个线程下不能多次要锁(acquire),不然会出现死锁的现象。
为什么会用到锁呢,在web电商项目中,买卖商品必然会有减库存的操作,而在多线程并发情况下,多个线程会同时访问库存并修改库存,如果同时修改就会出现多卖的情况。当然我们可以从数据库层面来解决,比如乐观锁,修改数据库的事务隔离级别等等,这些下回我再写。
同一时刻当然只能有一个python线程得以运行,但是当这个线程正在操作某个数据结构时,其他线程可能也会打断它,python解释器在执行两个连续的字节命令时。其他线程可能会在他执行中途插入,如果是多个线程同时执行上述的操作,就会引发危险的结果,一旦发生就会破坏程序的状态,从而使相关的数据结构无法保证其一致性。
+++
隔了好久,堕怠。。