python中lock锁和阻塞_Python的锁源码剖析

Lock

原始锁: 实现原始锁对象的类。一旦一个线程获得一个锁,会阻塞随后尝试获得锁的线程,直到它被释放;

任何线程都可以释放它。

class Lock:

def acquire(self, blocking=True, timeout=-1):

'''

blocking 阻塞: 阻塞状态下会维持到timeout时间然后抛出Runtime异常

非阻塞: 直接返回该锁状态(已锁---False 未锁---True)

timeout 定义超时时间,值为-1时不定义超时时间

'''

return False

def release(self):

'''

释放锁(任何线程都可以调用这个方法)

'''

pass

原始锁的原理相当的简单,就是一种互斥的机制,一个线程获取了该锁,其他线程就在获取锁的过程中发生阻塞或者返回一个状态码(bool),在此基础上实现下面的几种同步概念

RLock

可重入锁(递归锁),解决在同一线程中多次上锁引发的死锁问题

class RLock:

def __init__(self):

# 维护一个原始锁

self._block = Lock()

# 重入锁当前拥有者(线程id标识)

self._owner = None

# 当前拥有者的上锁次数

self._count = 0

def acquire(self, blocking=True, timeout=-1):

# 获取当前线程id

me = get_ident()

# 判断当前重入锁拥有者是否为自身

if self._owner == me:

# 如果为自身的就不阻塞而令count值 +1

self._count += 1

return 1

# 非拥有者则抢占锁(阻塞或返回True值表示该锁未有拥有者)

rc = self._block.acquire(blocking, timeout)

if rc:

# 未上锁情况下定义拥有者为自身

self._owner = me

self._count = 1

return rc

def release(self):

# 只允许拥有者自身解锁

if s

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值