मैंने हाल ही में एक कार्यक्रम लिखा है जो एक साधारण निर्माता/उपभोक्ता पैटर्न का उपयोग करता है। शुरुआत में इसे थ्रेडिंग के अनुचित उपयोग से संबंधित एक बग था। लॉक कि मैंने अंततः तय किया। लेकिन इससे मुझे लगता है कि निर्माता/उपभोक्ता पैटर्न को लॉकलेस तरीके से कार्यान्वित करना संभव है या नहीं।क्या यह पायथन निर्माता-उपभोक्ता लॉकलेस दृष्टिकोण थ्रेड-सुरक्षित है?
- एक निर्माता धागा: मेरे मामले में
आवश्यकताओं सरल थे।
- एक उपभोक्ता धागा।
- कतार केवल एक आइटम के लिए स्थान नहीं है।
- निर्माता अगले आइटम से पहले मौजूदा एक सेवन किया जाता है उत्पादन कर सकते हैं। इसलिए वर्तमान आइटम खो गया है, लेकिन यह मेरे लिए ठीक है।
- उपभोक्ता वर्तमान आइटम उपभोग कर सकते हैं इससे पहले कि अगले एक का उत्पादन किया है। इसलिए वर्तमान वस्तु को दो बार (या अधिक) खपत किया जाता है, लेकिन यह मेरे लिए ठीक है।
तो मैं यह लिखा:
QUEUE_ITEM = None
# this is executed in one threading.Thread object
def producer():
global QUEUE_ITEM
while True:
i = produce_item()
QUEUE_ITEM = i
# this is executed in another threading.Thread object
def consumer():
global QUEUE_ITEM
while True:
i = QUEUE_ITEM
consume_item(i)
मेरे सवाल यह है: इस कोड को धागे की सुरक्षित है?
तत्काल टिप्पणी: इस कोड को वास्तव में नहीं है लॉकसेल - मैं CPython उपयोग करें और यह जीआईएल है।
मैं कोड एक छोटे से परीक्षण किया है और यह काम करने लगता है। यह कुछ लोड और स्टोर ओप में अनुवाद करता है जो जीआईएल के कारण परमाणु हैं। लेकिन मुझे यह भी पता है कि del x
ऑपरेशन परमाणु नहीं है जब x __del__
विधि लागू करता है। तो अगर मेरे आइटम में __del__
विधि है और कुछ बुरा शेड्यूलिंग होता है, तो चीजें तोड़ सकती हैं। या नहीं?
एक और सवाल यह है कि: किस तरह के प्रतिबंध (उदाहरण के लिए उत्पादित वस्तुओं के प्रकार पर) उदाहरण के लिए मुझे ऊपर कोड को ठीक करने के लिए लगाया जाना चाहिए?
मेरे प्रश्न केवल लॉकलेस के साथ आने के लिए सीपीथॉन और जीआईएल के क्विर्क का उपयोग करने के लिए सैद्धांतिक संभावना के बारे में हैं (यानी थ्रेडिंग जैसी कोई ताला नहीं। कोड में स्पष्ट रूप से लॉक करें) समाधान।
आप __del__ विधि क्यों लिखेंगे? –