python lock_Python中Lock和Rlock

线程是进程中可以调度执行的实体。而且,它是操作系统中可以执行的最小处理单元。简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列。为了简单起见,你可以假设线程只是进程的子集!

Locks

锁是Python中用于同步的最简单的方式。锁有两种状态:上锁、释放锁。

锁是线程模块中的一个类,有两个主要方法:acquire()和release()当调用acquire()方法时,它锁定锁的执行并阻塞锁的执行,直到其他线程调用release()方法将其设置为解锁状态。锁帮助我们有效地访问程序中的共享资源,以防止数据损坏,它遵循互斥,因为一次只能有一个线程访问特定的资源。

让我们看看下面的例子来理解锁的使用:

import threading

#创建一个lock对象

lock = threading.Lock()

#初始化共享资源

abce = 0

def sumOne():

global abce

#锁定共享资源

lock.acquire()

abce = abce + 1

#释放共享资源

lock.release()

def sumTwo():

global abce

#锁定共享资源

lock.acquire()

abce = abce + 2

#释放共享资源

lock.release()

#调用函数

sumOne()

sumTwo()

print(abce)

在上面的程序中,lock是一个锁对象,全局变量abce是一个共享资源,sumOne()和sumTwo()函数扮作两个线程,在sumOne()函数中共享资源abce首先被锁定,然后增加了1,然后abce被释放。sumTwo()函数执行类似操作。两个函数sumOne()和sumTwo()不能同时访问共享资源abce,一次只能一个访问共享资源。

RLocks

默认的lock不能识别lock当前被哪个线程持有。如果任何线程正在访问共享资源,那么试图访问共享资源的其他线程将被阻塞,即使锁定共享资源的线程也是如此。在这些情况下,可重入锁(或RLock)用于防止访问共享资源时出现不必要的阻塞。如果共享资源在RLock中,那么可以安全地再次调用它。RLocked资源可以被不同的线程重复访问,即使它在被不同的线程调用时仍然可以正常工作。

让我们看看下面的例子来理解RLocks的使用:

import threading

#创建一个lock对象

lock = threading.Lock()

#初始化共享资源

abce = 0

#本线程访问共享资源

lock.acquire()

abce = abce + 1

#这个线程访问共享资源会被阻塞

lock.acquire()

abce = abce + 2

lock.release()

print(abce)

在上面的程序中,两个线程同时尝试访问共享资源abce,这里当一个线程当前正在访问共享资源abce时,另一个线程将被阻止访问它。当两个或多个线程试图访问相同的资源时,有效地阻止了彼此访问该资源,这就是所谓的死锁,因此上述程序没有生成任何输出。

但是,在程序中上述问题可以通过使用RLock来解决。

import threading

#创建一个rlock对象

lock = threading.RLock()

#初始化共享资源

abce = 0

#本线程访问共享资源

lock.acquire()

abce = abce + 1

#这个线程尝试访问共享资源

lock.acquire()

abce = abce + 2

lock.release()

print(abce)

在这里,没有阻止程序中的线程访问共享资源abce。对于RLock对象锁的每个acquire(),我们需要调用release()一次。

从上面提到的众多程序和解释中,在Python中一个Lock对象和一个RLock对象有很多区别:

locksrlocks

lock对象无法再被其他线程获取,除非持有线程释放

rlock对象可以被其他线程多次获取

lock对象可被任何线程释放

rlock对象只能被持有的线程释放

lock对象不可以被任何线程拥有

rlock对象可以被多个线程拥有

对一个对象锁定是很快的

对一个对象加rlock比加lock慢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值