gpt4 book ai didi

python - 何时以及如何使用 Python 的 RLock

转载 作者:IT老高 更新时间:2023-10-28 21:35:28 26 4
gpt4 key购买 nike

阅读我遇到的 Python 文档 RLock

谁能向我解释(举例)一个场景,其中 RLock会优先于 Lock ?

特别引用:

  • RLock 的“递归级别”。这有什么用?
  • RLock 对象的线程“所有权”
  • 性能?

最佳答案

这是我看到使用的一个例子:

有用的时候

  1. 您希望从类外部获得线程安全访问,并在类内部使用相同的方法:

    class X:
    def __init__(self):
    self.a = 1
    self.b = 2
    self.lock = threading.RLock()

    def changeA(self):
    with self.lock:
    self.a = self.a + 1

    def changeB(self):
    with self.lock:
    self.b = self.b + self.a

    def changeAandB(self):
    # you can use chanceA and changeB thread-safe!
    with self.lock:
    self.changeA() # a usual lock would block at here
    self.changeB()
  2. 为了更明显的递归:

    lock = threading.RLock()
    def a(...):
    with lock:

    a(...) # somewhere inside

    其他线程必须等到第一次调用 a 完成 = 线程所有权。

性能

通常,我从 Lock 开始编程,当情况 1 或 2 发生时,我切换到 RLock。 Until Python 3.2由于附加代码,RLock 应该会慢一些。它使用锁:

Lock = _allocate_lock # line 98 threading.py

def RLock(*args, **kwargs):
return _RLock(*args, **kwargs)

class _RLock(_Verbose):

def __init__(self, verbose=None):
_Verbose.__init__(self, verbose)
self.__block = _allocate_lock()

线程所有权

在给定的线程中,您可以随意获取 RLock。其他线程需要等到该线程再次释放资源。

这与 Lock 不同,后者意味着“函数调用所有权”(我会这样调用它):另一个函数调用必须等到资源被最后一个阻塞函数释放如果它在同一个线程中 = 即使它被另一个函数调用。

何时使用 Lock 而不是 RLock

当你调用你无法控制的资源外部时。

下面的代码有两个变量:a 和 b,并且应该使用 RLock 来确保 a == b * 2

import threading
a = 0
b = 0
lock = threading.RLock()
def changeAandB():
# this function works with an RLock and Lock
with lock:
global a, b
a += 1
b += 2
return a, b

def changeAandB2(callback):
# this function can return wrong results with RLock and can block with Lock
with lock:
global a, b
a += 1
callback() # this callback gets a wrong value when calling changeAandB2
b += 2
return a, b

changeAandB2 中,Lock 将是正确的选择,尽管它确实会阻塞。或者可以使用 RLock._is_owned() 来增强它的错误。 changeAandB2 之类的函数可能发生在您实现了观察者模式或发布者-订阅者并在之后添加锁定时。

关于python - 何时以及如何使用 Python 的 RLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16567958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com