python threading lock_Python threading._RLock方法代碼示例

# 需要導入模塊: import threading [as 別名]

# 或者: from threading import _RLock [as 別名]

def _safe_lock_release_py2(rlock):

"""Ensure that a threading.RLock is fully released for Python 2.

The RLock release code is:

https://github.com/python/cpython/blob/2.7/Lib/threading.py#L187

The RLock object's release method does not release all of its state if an

exception is raised in the middle of its operation. There are three pieces of

internal state that must be cleaned up:

- owning thread ident, an integer.

- entry count, an integer that counts how many times the current owner has

locked the RLock.

- internal lock, a threading.Lock instance that handles blocking.

Args:

rlock: threading.RLock, lock to fully release.

Yields:

None.

"""

assert isinstance(rlock, threading._RLock)

ident = _thread.get_ident()

expected_count = 0

if rlock._RLock__owner == ident:

expected_count = rlock._RLock__count

try:

yield

except ThreadTerminationError:

# Check if the current thread still owns the lock by checking if we can

# acquire the underlying lock.

if rlock._RLock__block.acquire(0):

# Lock is clean, so unlock and we are done.

rlock._RLock__block.release()

elif rlock._RLock__owner == ident and expected_count > 0:

# The lock is still held up the stack, so make sure the count is accurate.

if rlock._RLock__count != expected_count:

rlock._RLock__count = expected_count

elif rlock._RLock__owner == ident or rlock._RLock__owner is None:

# The internal lock is still acquired, but either this thread or no thread

# owns it, which means it needs to be hard reset.

rlock._RLock__owner = None

rlock._RLock__count = 0

rlock._RLock__block.release()

raise

# pylint: enable=protected-access

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值