2014-04-05 14 views
31

Từ docs là gì:sự khác biệt giữa các Khóa và RLock

threading.RLock() - Một chức năng nhà máy mà trả về một đối tượng khóa reentrant mới. Một khóa reentrant phải được phát hành bởi các chủ đề có được nó. Khi một sợi đã lấy được khóa reentrant, cùng một luồng có thể lấy lại nó mà không bị chặn; chủ đề phải phát hành nó một lần cho mỗi lần nó có được nó.

Tôi không chắc tại sao chúng ta cần điều này? sự khác nhau giữa RlockLock là gì?

cảm ơn

Trả lời

67

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à hcô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() 
Các vấn đề liên quan