Lock vs RLock 简单对比
主要区别是Lock
只能被获取一次,不能被释放前再次被获取。(在它被释放后,可以被任意线程重新获取) RLock
则是另一种表现,可以被同一线程多次获取。它需要被释放同样次数才能被释放。 另一个区别是获取Lock
可以被任意线程释放,当一个被获取的RLock
只能被获取它的线程释放。 以下的例子是展示为什么RLock
有时候是有用的。假定你有:
1
2
3
4
5
6
7
8
9
10
def f():
g()
h()
def g():
h()
do_something1()
def h():
do_something2()
让我们假设所有f
,g
和h
都是public
,他们都是需要同步操作 使用一个Lock
,你可以做一些事儿,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
。所以你需要每个函数都有一个异步版本和一个同步版本
使用RLock
可以很优雅的解决这个问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
lock = RLock()
def f():
with lock:
g()
h()
def g():
with lock:
h()
do_something1()
def h():
with lock:
do_something2()