जवाबों:
मैं इस प्रश्न के वास्तविक उत्तर के लिए "द जॉय ऑफ क्लोजर" या "प्रोग्रामिंग क्लोजर" की अत्यधिक अनुशंसा करता हूं, मैं प्रत्येक के लिए प्रेरणाओं के एक छोटे से निशान को पुन: पेश कर सकता हूं:
आइडेंटिटी और / या यहाँ अध्ययन की धारणा पर इस वीडियो को देखकर शुरू करें ।
समन्वित पहुंच का उपयोग तब किया जाता है जब दो पहचानों को एक साथ बदलने की आवश्यकता होती है, क्लासिक उदाहरण एक बैंक खाते से दूसरे में पैसा ले जा रहा है, इसे या तो पूरी तरह से स्थानांतरित करने की आवश्यकता है या बिल्कुल नहीं।
अनधिकृत पहुंच का उपयोग तब किया जाता है जब केवल एक पहचान को अद्यतन करने की आवश्यकता होती है, यह एक बहुत ही सामान्य मामला है।
सिंक्रोनस एक्सेस का उपयोग तब किया जाता है जब कॉल को प्रतीक्षा करने की उम्मीद की जाती है जब तक कि सभी पहचान जारी रखने से पहले बस गए।
अतुल्यकालिक पहुंच "आग और भूल" है और पहचान को अपने समय में अपने नए राज्य तक पहुंचने दें।
ensure
फ़ंक्शन का उपयोग करने पर विचार करें : clojure.github.io/clojure/clojure.core-api.html#clojure.core/… इसे स्पष्ट और अधिक कुशल बनाने के लिए।
Ref राज्य के लिए हैं जिन्हें थ्रेड्स के बीच सिंक्रनाइज़ करने की आवश्यकता होती है। यदि आपको अलग-अलग चीजों का एक गुच्छा रखने की आवश्यकता है और आपको कभी-कभी ऑपरेशन करने की आवश्यकता होगी जो एक ही बार में कई चीजों को लिखते हैं, तो उपयोग करें। किसी भी समय आपके पास राज्य के कई अलग-अलग टुकड़े हैं, रेफ का उपयोग करना एक बुरा विचार नहीं है।
परमाणु स्वतंत्र स्थिति के लिए होते हैं जिन्हें थ्रेड्स के बीच सिंक्रनाइज़ करने की आवश्यकता होती है। यदि आपको एक ही समय में परमाणु की स्थिति और कुछ भी बदलने की आवश्यकता नहीं है, तो परमाणु का उपयोग करना सुरक्षित है (विशेष रूप से, यदि पूरे कार्यक्रम में केवल एक टुकड़ा है, तो आप इसे परमाणु में रख सकते हैं) । एक गैर-तुच्छ उदाहरण के रूप में, यदि आप किसी फ़ंक्शन के रिटर्न मान को कैश करने की कोशिश कर रहे हैं (यानी इसे याद रखें), एक परमाणु का उपयोग करना संभवतः सुरक्षित है - राज्य फ़ंक्शन के बाहर सब कुछ अदृश्य है, इसलिए आपको चिंता करने की आवश्यकता नहीं है समारोह के अंदर एक राज्य परिवर्तन के बारे में कुछ भी गड़बड़।
एजेंट प्राथमिक बिंदु यह है कि वे एक अलग धागे में चलते हैं। आप एजेंट का मूल्य प्राप्त कर सकते हैं और बता सकते हैं कि इसके मूल्य पर कोई फ़ंक्शन लागू किया जा सकता है, लेकिन आपको नहीं पता कि फ़ंक्शन कब चलेगा या फ़ंक्शन किस मान पर लागू होगा।
वर्स तब होता है जब आपको प्रति-थ्रेड के आधार पर कुछ स्टोर करने की आवश्यकता होती है। यदि आपके पास एक बहु-थ्रेडेड प्रोग्राम है और प्रत्येक थ्रेड को अपनी निजी स्थिति की आवश्यकता है, तो उस स्थिति को एक var में रखें।
जहां तक वास्तविक दुनिया के उदाहरणों की बात है, यदि आप ऐसा करने का प्रयास करते हैं कि आप क्या करने की कोशिश कर रहे हैं, तो हम आपको बता सकते हैं कि क्या उपयोग करना है।
जब मैंने पहली बार इन प्रकारों के बारे में पढ़ा, तो मैंने यह समझने के लिए भी संघर्ष किया कि मैं अपने सादे अंग्रेजी उत्तर में से प्रत्येक का उपयोग कहाँ कर सकता हूँ या करना चाहिए:
जब डेटा नहीं बदलेगा तो एक var का उपयोग करें। यह तब होता है जब भी आप उपयोग करते हैं def
या सबसे अधिक कार्य करते हैं जो def
पसंद करते हैं defn
।
जब आपके पास कोई एकल आइटम हो जो परिवर्तित हो, तो एक परमाणु का उपयोग करें। एक उदाहरण एक काउंटर या वेक्टर हो सकता है जिसे आप आइटम जोड़ना चाहते हैं।
जब आपके पास दो या दो से अधिक चीजें हों, तो उसी समय रेफरी का उपयोग करें। यदि आप परिचित हैं तो "डेटाबेस लेनदेन" सोचें। इसका विहित उदाहरण एक खाते से दूसरे खाते में धन हस्तांतरित करना है। प्रत्येक खाते को एक रेफरी में संग्रहीत किया जा सकता है ताकि परमाणु दिखाई देने के लिए परिवर्तन किए जा सकें।
जब आप कुछ बदलना चाहते हैं तो एक एजेंट का उपयोग करें लेकिन जब आप परवाह नहीं करते हैं। यह एक लंबी गणना या फ़ाइल या सॉकेट के लिए कुछ लिखने के लिए हो सकता है। ध्यान दें कि उत्तरार्द्ध के साथ आपको उपयोग करना चाहिए send-off
।
नोट: मैं सराहना करता हूं कि इनमें से प्रत्येक के लिए बहुत अधिक है लेकिन उम्मीद है कि यह आपको एक प्रारंभिक बिंदु देना चाहिए।
मैंने उनके बीच के अंतर को सारांश के साथ लेख लिखा और जो एक का उपयोग करते समय चुनने में मदद करता है।
शेयर स्थिति - जब var, परमाणु, एजेंट और रेफ का उपयोग करते हैं?
मुझे उम्मीद है कि यह लोगों को उस विषय में उत्तर तलाशने में मदद करेगा।
@Tunaci सुझाव के बाद लेख के कुछ शॉर्टकट:
Vars
वर्स हर धागे के लिए वैश्विक हैं।
बनाने के बाद वेरिएशन न बदलें। यह तकनीकी रूप से संभव है, लेकिन यह कई कारणों से बुरा है।
परमाणुओं
प्रत्येक थ्रेड के लिए उत्परिवर्तनीय स्थिति तक पहुँच साझा करें। परिवर्तन समकालिक रूप से होता है। जब अन्य थ्रेड रन के दौरान स्थिति बदलते हैं तो पुन: प्रयास करें।
लंबे समय के निष्पादन के साथ बेकार कार्यों और कार्यों का उपयोग न करें
एजेंटों
प्रत्येक थ्रेड के लिए उत्परिवर्तनीय स्थिति तक पहुँच साझा करें। परिवर्तन एसिंक्रोनस रूप से होता है।
refs
Refs डेटाबेस लेनदेन के समान काम करता है। लिखना और पढ़ना dosync में सुरक्षित है। आप लेन-देन में सुरक्षित कई रेफरी पर काम कर सकते हैं।
और फ्लोचार्ट जब कौन सा उपयोग करें:
कृपया वेबसाइट पर छवि देखें, क्योंकि कुछ अपडेट हमेशा संभव हैं।
यह जटिल है और प्रतिलिपि और पिछले लेख के बिना पूर्ण उत्तर देने के लिए एक लंबा विषय है, इसलिए कृपया मुझे क्षमा करें, मैं आपको वेबसाइट पर पुनः निर्देशित करता हूं :)
परमाणु, रेफ और एजेंट - कुछ रोशनी यहाँ http://blog.jayfields.com/2011/04/clojure-state-management.html
state-a
, लेकिनstate-b
ऐसा करने का संदर्भ लें , तो मुझे अभी भी एकref
सही की आवश्यकता है ? तो यह कई चीजों को नहीं बदल रहा है, लेकिन उनमें से किसी को बदलते समय कई चीजों का जिक्र है?