当前位置: 首页 > 知识库问答 >
问题:

Lock和RLock的区别是什么

赫连俊雄
2023-03-14

从文件中:

线程。RLock()——一个返回新可重入锁对象的工厂函数。可重入锁必须由获取它的线程释放。一旦线程获取了可重入锁,同一线程可以再次获取它而不会阻塞;线程每次获取它时必须释放一次。

我不确定为什么我们需要这个?RlockLock有什么区别?

共有3个答案

戚俊人
2023-03-14

RLock被称为递归锁。基本上它是一个只有持有者才能释放的锁。在Lock中,任何线程都可以释放。

燕星鹏
2023-03-14

为了扩展shx2的答案,您想要使用一个而不是另一个的原因可能如下:

常规的Lock(互斥锁)通常更快、更安全。

使用RLock的原因是为了避免由于递归等原因而导致死锁。例如,让我们在递归阶乘函数中设置一个锁。(无可否认有些做作)

from threading import Lock

lock = Lock()

def factorial(n):
    assert n > 0
    if n == 1:
        return 1
    
    with lock:       
        out = n * factorial(n - 1)

    return out

由于递归调用,此函数将导致死锁。但是,如果我们改用RLock,递归调用可以根据需要多次重新输入同一个锁。因此被称为可重入(或递归)锁。

聂永怡
2023-03-14

主要区别是Lock只能被获取一次。在它被释放之前,它不能被再次获取。(在它被释放后,它可以被任何线程重新获取)。

另一方面,RLock可以通过同一线程多次获取。需要释放相同次数才能“解锁”。

另一个区别是,获取的可以由任何线程释放,而获取的RLock只能由获取它的线程释放。

下面是一个例子,说明为什么RLock有时很有用。假设您有:

def f():
  g()
  h()

def g():
  h()
  do_something1()

def h():
  do_something2()

假设所有的fgh都是公共的(即可以由外部调用方直接调用),并且所有这些都需要同步。

使用,可以执行以下操作:

lock = Lock()

def f():
  with lock:
    _g()
    _h()

def g():
  with lock:
    _g()

def _g():
  _h()
  do_something1()

def h():
  with lock:
    _h()

def _h():
  do_something2()

基本上,由于f在获得锁后无法调用g,它需要调用g的“原始”版本(即\u g)。因此,每个函数最终都有一个“同步”版本和一个“原始”版本。

使用RLock优雅地解决了这个问题:

lock = RLock()

def f():
  with lock:
    g()
    h()

def g():
  with lock:
    h()
    do_something1()

def h():
  with lock:
    do_something2()
 类似资料:
  • 本文向大家介绍详解Python中的Lock和Rlock,包括了详解Python中的Lock和Rlock的使用技巧和注意事项,需要的朋友参考一下 线程是进程中可以调度执行的实体。而且,它是操作系统中可以执行的最小处理单元。简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列。为了简单起见,你可以假设线程只是进程的子集! Locks 锁是Python中用于同步的最简单的方式。锁有两种状态:

  • 本文向大家介绍synchronized 和 Lock 有什么区别?相关面试题,主要包含被问及synchronized 和 Lock 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁

  • 本文向大家介绍浅谈Synchronized和Lock的区别,包括了浅谈Synchronized和Lock的区别的使用技巧和注意事项,需要的朋友参考一下 如下所示: Synchronized是内置的java关键字,Lock是一个java类。 Synchronized无法判断是否获取到了锁,Lock可以判断是否获取到了锁。 Synchronized会自动释放锁,Lock必须手动释放锁。 Synchro

  • 本文向大家介绍#{}和${}的区别是什么?相关面试题,主要包含被问及#{}和${}的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 #{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值; Mybatis 在处理{}时,就是把${}替换成变量的值。 使用#{}可以有效的防

  • 本文向大家介绍Java 多线程Synchronized和Lock的区别,包括了Java 多线程Synchronized和Lock的区别的使用技巧和注意事项,需要的朋友参考一下 引言   在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下: 区别     1、synchroni

  • 本文向大家介绍简单了解synchronized和lock的区别,包括了简单了解synchronized和lock的区别的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解synchronized和lock的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类别 synchronized Lock 存在层次 Java的关键字 一个