python多线程的锁用法

这里写自定义目录标题

python多线程的锁用法

https://blog.csdn.net/hellenlee22/article/details/93640487

锁机制
在了解锁机制前,我们先来看一下下面这个例子:

## 使用多线程进行加法运算
import threading

# 定义全局变量VALUE
VALUE = 0

# 定义加法线程函数
def add_value():
    global VALUE
    for x in range(1000000):
        VALUE += 1
    print('value = ', VALUE)

# 定义两个线程并发执行加法操作
def add_thread_main():
    for x in range(2):
        t = threading.Thread(target=add_value)
        t.start()

if __name__ == '__main__':
    add_thread_main()

"""
Output:
value =  1147074
value =  1211397
"""

上面的示例按照我们的逻辑看来应该是依次输出1000000和2000000,但结果并不是这样的,这就是常说的多线程共享全局变量问题。其实在我们执行线程时,执行的顺序是不一定的,也就是说有时候可能重合在一起执行,因而导致有时虽二者都对共享变量进行了一次加法(即本应加两次)而实际上只真正加了一次。

而为了解决这样的问题,threading模块提供了一个Lock类,这个类可以在某个线程访问某个变量的时候加锁,其他线程此时不能访问该变量,直到加锁线程处理完控制变量并把锁释放了,其他线程才能进行访问处理。锁机制使用起来也很简单,由于是多个线程访问共享变量,因而需设置一个全局的Lock类对象,然后在访问前后分别使用Lock类的acquire()方法加锁和release()方法释放锁。

上述例子使用锁机制仅需做以下几处的修改:

## 使用多线程进行加法运算
import threading

# 定义全局变量VALUE
VALUE = 0
gLock = threading.Lock()

# 定义加法线程函数
def add_value():
    global VALUE
    gLock.acquire()
    for x in range(100000):
        VALUE += 1
    print('value = ', VALUE)
    gLock.release()

# 定义两个线程并发执行加法操作
def add_thread_main():
    for x in range(4):
        t = threading.Thread(target=add_value)
        t.start()

if __name__ == '__main__':
    add_thread_main()
“””
output:
value =  100000
value =  200000
value =  300000
value =  400000
"""

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值