python 多线程 锁Lock

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解释器在执行两个连续的字节命令时。其他线程可能会在他执行中途插入,如果是多个线程同时执行上述的操作,就会引发危险的结果,一旦发生就会破坏程序的状态,从而使相关的数据结构无法保证其一致性。

+++

隔了好久,堕怠。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值