python教程—Lock和RLock的区别是什么-Python实用宝典

python教程—Lock和RLock的区别是什么

从文档中:thread . rlock()—— 返回一个新的可重入锁对象的工厂函数。重入锁必须由获取它的线程释放。一旦一个线程获得了一个重入锁,该线程可以在不阻塞的情况下再次获得它;线程每次获得它时必须释放它一次。

文档:

threading.RLock (),
返回一个新的可重入锁对象的工厂函数。重入锁必须由获取它的线程释放。一旦一个线程获得了一个重入锁,该线程可以在不阻塞的情况下再次获得它;线程每次获得它时必须释放它一次。

我不确定我们为什么需要这个?
Rlock和Lock的区别是什么?

回答

主要的区别是锁只能被获取一次。它不能再被获得,直到它被释放。(发布后,任何线程都可以重新查询)。

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

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


下面是一个例子,演示了为什么RLock有时是有用的。假设你有:

    def f(): g() h() def g(): h() do_something1() def h(): do_something2()

假设所有的f、g和h都public(即可以由外部调用者直接调用),并且它们都需要同步。

使用锁,你可以这样做:

    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的“原始”版本(即_g)。因此,最终将得到每个函数的“同步”版本和“原始”版本。

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

    lock = RLock() def f(): with lock: g() h() def g(): with lock: h() do_something1() def h(): with lock: do_something2()

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论