Sự khác biệt chính là chỉ có thể mua Lock
một lần. Nó không thể có được một lần nữa, cho đến khi nó được phát hành. (Sau khi nó được phát hành, nó có thể được tái acaquired bởi bất kỳ chủ đề).
Mặt khác, có thể thu được RLock
nhiều lần bằng cùng một chuỗi. Nó cần phải được phát hành cùng một số lần để được "mở khóa".
Một khác biệt khác là một số Lock
được mua lại có thể được giải phóng bởi bất kỳ chuỗi nào, trong khi chỉ có thể giải phóng được RLock
bằng chuỗi đã mua.
Dưới đây là một ví dụ demostrating tại sao RLock
rất hữu ích vào những thời điểm. Giả sử bạn có:
def f():
g()
h()
def g():
h()
do_something1()
def h():
do_something2()
Giả sử tất cả các f
, g
, và h
là công (ví dụ có thể được gọi trực tiếp bởi một người gọi bên ngoài), và tất cả trong số họ yêu cầu syncronization.
Sử dụng một Lock
, bạn có thể làm điều gì đó như:
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()
Về cơ bản, vì f
không thể gọi g
sau khi mua khóa, nó cần phải gọi một phiên bản "thô" của g
(ví dụ: _g
). Vì vậy, bạn kết thúc với một phiên bản "đồng bộ hóa" và một phiên bản "thô" của mỗi chức năng.
Sử dụng một RLock
tao nhã giải quyết vấn đề:
lock = RLock()
def f():
with lock:
g()
h()
def g():
with lock:
h()
do_something1()
def h():
with lock:
do_something2()