2014-04-05 8 views
31

के बीच का अंतर docs से है:क्या लॉक और RLock

threading.RLock() - एक कारखाने समारोह है कि एक नया रैत्रांत ताला वस्तु देता है। एक पुनर्विक्रेता ताला उस धागे द्वारा जारी किया जाना चाहिए जो इसे प्राप्त करता है। एक बार धागे ने एक पुनर्विक्रय ताला हासिल कर लिया है, वही थ्रेड इसे बिना किसी अवरोध के फिर से प्राप्त कर सकता है; प्रत्येक बार इसे प्राप्त करने के लिए धागे को इसे एक बार रिलीज़ करना होगा।

मुझे यकीन नहीं है कि हमें इसकी आवश्यकता क्यों है? Rlock और Lock के बीच क्या अंतर है?

धन्यवाद

उत्तर

67

मुख्य अंतर यह है कि एक Lock केवल एक बार प्राप्त किया जा सकता है। इसे तब तक हासिल नहीं किया जा सकता जब तक इसे जारी नहीं किया जाता है। (इसे जारी करने के बाद, इसे किसी भी थ्रेड द्वारा पुनः प्राप्त किया जा सकता है)।

दूसरी ओर एक RLock, उसी धागे से कई बार अधिग्रहित किया जा सकता है। "अनलॉक" होने के लिए इसे कई बार जारी किया जाना चाहिए।

एक और अंतर यह है कि एक अधिग्रहित Lock किसी भी थ्रेड द्वारा जारी किया जा सकता है, जबकि एक अधिग्रहण RLock केवल इसे प्राप्त किए गए थ्रेड द्वारा जारी किया जा सकता है।


यहां उदाहरण दिया गया है कि RLock कभी-कभी उपयोगी क्यों होता है। मान लीजिए आप है:

def f(): 
    g() 
    h() 

def g(): 
    h() 
    do_something1() 

def h(): 
    do_something2() 

के f, g के सभी मान लें, और hसार्वजनिक (अर्थात एक बाहरी कॉल करने वाले को सीधे कहा जा सकता है) कर रहे हैं, और उन सभी समन्वयन की आवश्यकता है।

एक Lock उपयोग करके, आप की तरह कुछ कर सकते हैं:

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) कॉल करने के लिए की जरूरत है। तो आप एक "समन्वयित" संस्करण और प्रत्येक समारोह के "कच्चे" संस्करण के साथ समाप्त होते हैं।

lock = RLock() 

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

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

def h(): 
    with lock: 
    do_something2() 
:

एक RLock का उपयोग करते हुए सुंदर ढंग से समस्या का हल

संबंधित मुद्दे