कठोर मानचित्र पहुंच के बिना map
से चीजों को साफ़ करने के तरीकों का एक समूह है। आपके आवेदन के लिए क्या काम करता है यह इस पर निर्भर करता है कि यह क्या कर रहा है।
0) जब आप उस पर काम करते हैं तो बस मानचित्र को लॉक करें। यदि नक्शा बहुत बड़ा नहीं है, या आपके पास कुछ विलंबता सहनशीलता है, तो यह काम जल्दी से हो जाता है (समय के संदर्भ में आप इस पर खर्च करते हैं) और आप अन्य सामानों के बारे में सोचने के लिए आगे बढ़ सकते हैं। यदि यह बाद में कोई समस्या बन जाती है, तो आप तब समस्या पर वापस आ सकते हैं।
1) ऑब्जेक्ट्स या पॉइंटर्स को लॉक करते समय मानचित्र को साफ़ करें और साफ़ करें, फिर ऑब्जेक्ट को पृष्ठभूमि में छोड़ दें। यदि समस्या यह है कि खुद को रिहा करने की धीमी गति से लॉक को लंबे समय तक रखा जाएगा, तो यह उसके लिए आसान कामकाज है।
2) यदि कुशल पढ़े मूल रूप से सभी महत्वपूर्ण हैं, तो atomic.Value
का उपयोग करें। यह आपको एक मानचित्र को एक नए और अलग से पूरी तरह से बदलने देता है।यदि लिखते हैं तो आपके वर्कलोड का अनिवार्य रूप से 0% है, कुशल प्रत्येक परिवर्तन पर एक नया नक्शा बनाने की लागत को संतुलित करता है। यह दुर्लभ है, लेकिन ऐसा होता है, उदाहरण के लिए, encoding/gob
इस प्रकार के प्रकारों का एक वैश्विक मानचित्र है।
3) यदि उनमें से कोई भी आपको जो कुछ भी चाहिए, वह नहीं करता है, तो आप डेटा को कैसे स्टोर करते हैं (उदाहरण के लिए मानचित्र को शेड करें)। अपने मानचित्र को 16 मानचित्रों और हैश कुंजियों के साथ बदलें, यह तय करने के लिए कि कोई नक्शा किस चीज में है, और फिर आप सफाई या किसी अन्य लेखन के लिए एक समय में एक शार्ड लॉक कर सकते हैं।
रिलीज और उपयोग के बीच दौड़ का मुद्दा भी है: goroutine ए मानचित्र से कुछ प्राप्त करता है, बी मानचित्र को साफ़ करता है और चीज़ को रिलीज़ करता है, ए रिलीज़ की गई चीज़ का उपयोग करता है।
जब आप इसका उपयोग करते हैं या इसे छोड़ते हैं तो प्रत्येक मान को लॉक करना एक रणनीति है; तो आपको ताले की जरूरत है लेकिन वैश्विक नहीं।
एक और दौड़ के परिणामों को सहन करना है यदि वे ज्ञात हैं और विनाशकारी नहीं हैं; उदाहरण के लिए, net.Conn
एस के समवर्ती उपयोग को इसके दस्तावेज़ों द्वारा स्पष्ट रूप से अनुमति दी जाती है, इसलिए इन-उपयोग कनेक्शन को बंद करने से यह त्रुटि पर अनुरोध हो सकता है लेकिन यह अपरिभाषित ऐप व्यवहार का कारण नहीं बनता है। आपको वास्तव में यह सुनिश्चित करना होगा कि आप जानते हैं कि आप क्या प्राप्त कर रहे हैं, हालांकि, many benign-seeming races aren't का कारण बनता है।
अंततः, शायद आपका एप्लिकेशन पहले से ही उपयोग में आने वाली वस्तुओं को जारी नहीं कर रहा है, उदाहरण के लिए वस्तुओं पर एक सुरक्षित रूप से बनाए रखा संदर्भ गणना है और केवल अप्रयुक्त वस्तुओं को जारी किया जाता है। फिर, ज़ाहिर है, आपको चिंता करने की ज़रूरत नहीं है।
किसी भी तरह से इन ताले को चैनलों से बदलने की कोशिश करना मोहक हो सकता है लेकिन मुझे इससे कोई लाभ नहीं दिख रहा है। यह अच्छा है जब आप मुख्य रूप से साझा डेटा के बजाय प्रक्रियाओं के बीच संचार के संदर्भ में अपने ऐप को डिज़ाइन कर सकते हैं, लेकिन जब आपने डेटा साझा किया है, तो अन्यथा नाटक करने में कोई उपयोग नहीं है। साझा डेटा तक असुरक्षित पहुंच को छोड़कर यह है कि ताले क्या हैं।
हमें इसके साथ काम करने के लिए अधिक संदर्भ की आवश्यकता है। मानचित्र में क्या है? क्या यह बड़ा है? एक चीज़ को कितनी तेजी से जारी किया जा रहा है? (क्या _is_ रिलीज़िंग?) क्या यह एक आपदा है यदि एक जारी वस्तु का उपयोग किसी अन्य गोरौटाइन द्वारा किया जाता है, और यदि ऐसा है, तो यह निर्धारित करता है कि मानचित्र से कितनी वस्तु निकाली जाती है? आवेदन क्या है और इसकी प्राथमिकताओं क्या हैं (उदा। थ्रूपुट बनाम विलंबता अधिकतम सीमा)? – twotwotwo