उदाहरण के साथ रेफ, वार, एजेंट, एटम के बीच क्लोजर अंतर


110

मैं क्लोजुर के लिए बहुत नया हूं, क्या आप लोग मुझे वास्तविक दुनिया के परिदृश्यों के साथ स्पष्टीकरण दे सकते हैं। मेरा मतलब है, जहां Ref, Var, Agent, Atom का उपयोग करना है। मैंने किताब पढ़ी, लेकिन, अभी भी वास्तविक दुनिया के उदाहरणों को समझ नहीं पाया।

जवाबों:


174

मैं इस प्रश्न के वास्तविक उत्तर के लिए "द जॉय ऑफ क्लोजर" या "प्रोग्रामिंग क्लोजर" की अत्यधिक अनुशंसा करता हूं, मैं प्रत्येक के लिए प्रेरणाओं के एक छोटे से निशान को पुन: पेश कर सकता हूं:

आइडेंटिटी और / या यहाँ अध्ययन की धारणा पर इस वीडियो को देखकर शुरू करें

  • रेफरी समन्वित सिंक्रोनस "कई पहचान" तक पहुंच के लिए हैं।
  • परमाणु एकल पहचान के लिए अनधिकृत तुल्यकालिक पहुंच के लिए हैं।
  • एजेंट एकल पहचान के लिए गैर-समन्वित अतुल्यकालिक पहुंच के लिए हैं।
  • एक साझा डिफ़ॉल्ट मान के साथ वार्स थ्रेड स्थानीय पृथक पहचान के लिए हैं ।

समन्वित पहुंच का उपयोग तब किया जाता है जब दो पहचानों को एक साथ बदलने की आवश्यकता होती है, क्लासिक उदाहरण एक बैंक खाते से दूसरे में पैसा ले जा रहा है, इसे या तो पूरी तरह से स्थानांतरित करने की आवश्यकता है या बिल्कुल नहीं।

अनधिकृत पहुंच का उपयोग तब किया जाता है जब केवल एक पहचान को अद्यतन करने की आवश्यकता होती है, यह एक बहुत ही सामान्य मामला है।

सिंक्रोनस एक्सेस का उपयोग तब किया जाता है जब कॉल को प्रतीक्षा करने की उम्मीद की जाती है जब तक कि सभी पहचान जारी रखने से पहले बस गए।

अतुल्यकालिक पहुंच "आग और भूल" है और पहचान को अपने समय में अपने नए राज्य तक पहुंचने दें।


समन्वित पहुंच में, अगर मैं केवल परिवर्तन करना चाहता हूं state-a, लेकिन state-bऐसा करने का संदर्भ लें , तो मुझे अभी भी एक refसही की आवश्यकता है ? तो यह कई चीजों को नहीं बदल रहा है, लेकिन उनमें से किसी को बदलते समय कई चीजों का जिक्र है?
event_jr

2
हाँ, आप सही ढंग से समझते हैं कि राज्य-ए और राज्य-बी दोनों को रेफ होना चाहिए। यदि आप चाहते हैं कि राज्य में नया मूल्य ए और बी में मूल्यों के सुसंगत संयोजन पर आधारित हो। आपको उस नए मान की गणना उस संदर्भ में करनी चाहिए जहां राज्य-ए और राज्य-बी जहां प्रत्येक अभिभावक के अनुरूप हो। जब वे दोनों रिफ होते हैं, यदि b बीच में बदल जाता है, तो लेनदेन फिर से शुरू हो जाएगा और a और b दोनों के नए मूल्यों का उपयोग करेगा। ensureफ़ंक्शन का उपयोग करने पर विचार करें : clojure.github.io/clojure/clojure.core-api.html#clojure.core/… इसे स्पष्ट और अधिक कुशल बनाने के लिए।
आर्थर उल्फल्ड्ट

3
हो सकता है कि उत्तर को पूरा करने के लिए साझा किए गए डिफ़ॉल्ट साधनों के साथ अलग-थलग होने का क्या अर्थ जोड़ा जा सकता है?
डिडियर ए।

1
"समन्वित पहुंच का उपयोग तब किया जाता है जब दो पहचानों को एक साथ बदलने की आवश्यकता होती है ..."। क्या उसे "परिवर्तित" होना चाहिए?
कार्क्जिनेट

40

Ref राज्य के लिए हैं जिन्हें थ्रेड्स के बीच सिंक्रनाइज़ करने की आवश्यकता होती है। यदि आपको अलग-अलग चीजों का एक गुच्छा रखने की आवश्यकता है और आपको कभी-कभी ऑपरेशन करने की आवश्यकता होगी जो एक ही बार में कई चीजों को लिखते हैं, तो उपयोग करें। किसी भी समय आपके पास राज्य के कई अलग-अलग टुकड़े हैं, रेफ का उपयोग करना एक बुरा विचार नहीं है।

परमाणु स्वतंत्र स्थिति के लिए होते हैं जिन्हें थ्रेड्स के बीच सिंक्रनाइज़ करने की आवश्यकता होती है। यदि आपको एक ही समय में परमाणु की स्थिति और कुछ भी बदलने की आवश्यकता नहीं है, तो परमाणु का उपयोग करना सुरक्षित है (विशेष रूप से, यदि पूरे कार्यक्रम में केवल एक टुकड़ा है, तो आप इसे परमाणु में रख सकते हैं) । एक गैर-तुच्छ उदाहरण के रूप में, यदि आप किसी फ़ंक्शन के रिटर्न मान को कैश करने की कोशिश कर रहे हैं (यानी इसे याद रखें), एक परमाणु का उपयोग करना संभवतः सुरक्षित है - राज्य फ़ंक्शन के बाहर सब कुछ अदृश्य है, इसलिए आपको चिंता करने की आवश्यकता नहीं है समारोह के अंदर एक राज्य परिवर्तन के बारे में कुछ भी गड़बड़।

एजेंट प्राथमिक बिंदु यह है कि वे एक अलग धागे में चलते हैं। आप एजेंट का मूल्य प्राप्त कर सकते हैं और बता सकते हैं कि इसके मूल्य पर कोई फ़ंक्शन लागू किया जा सकता है, लेकिन आपको नहीं पता कि फ़ंक्शन कब चलेगा या फ़ंक्शन किस मान पर लागू होगा।

वर्स तब होता है जब आपको प्रति-थ्रेड के आधार पर कुछ स्टोर करने की आवश्यकता होती है। यदि आपके पास एक बहु-थ्रेडेड प्रोग्राम है और प्रत्येक थ्रेड को अपनी निजी स्थिति की आवश्यकता है, तो उस स्थिति को एक var में रखें।

जहां तक ​​वास्तविक दुनिया के उदाहरणों की बात है, यदि आप ऐसा करने का प्रयास करते हैं कि आप क्या करने की कोशिश कर रहे हैं, तो हम आपको बता सकते हैं कि क्या उपयोग करना है।


32

जब मैंने पहली बार इन प्रकारों के बारे में पढ़ा, तो मैंने यह समझने के लिए भी संघर्ष किया कि मैं अपने सादे अंग्रेजी उत्तर में से प्रत्येक का उपयोग कहाँ कर सकता हूँ या करना चाहिए:

जब डेटा नहीं बदलेगा तो एक var का उपयोग करें। यह तब होता है जब भी आप उपयोग करते हैं defया सबसे अधिक कार्य करते हैं जो defपसंद करते हैं defn

जब आपके पास कोई एकल आइटम हो जो परिवर्तित हो, तो एक परमाणु का उपयोग करें। एक उदाहरण एक काउंटर या वेक्टर हो सकता है जिसे आप आइटम जोड़ना चाहते हैं।

जब आपके पास दो या दो से अधिक चीजें हों, तो उसी समय रेफरी का उपयोग करें। यदि आप परिचित हैं तो "डेटाबेस लेनदेन" सोचें। इसका विहित उदाहरण एक खाते से दूसरे खाते में धन हस्तांतरित करना है। प्रत्येक खाते को एक रेफरी में संग्रहीत किया जा सकता है ताकि परमाणु दिखाई देने के लिए परिवर्तन किए जा सकें।

जब आप कुछ बदलना चाहते हैं तो एक एजेंट का उपयोग करें लेकिन जब आप परवाह नहीं करते हैं। यह एक लंबी गणना या फ़ाइल या सॉकेट के लिए कुछ लिखने के लिए हो सकता है। ध्यान दें कि उत्तरार्द्ध के साथ आपको उपयोग करना चाहिए send-off

नोट: मैं सराहना करता हूं कि इनमें से प्रत्येक के लिए बहुत अधिक है लेकिन उम्मीद है कि यह आपको एक प्रारंभिक बिंदु देना चाहिए।


1
आपकी स्पष्ट प्रतिक्रिया के लिए बहुत बहुत धन्यवाद :-) मेरे जैसे एक लौंग नवाबी को काफी मदद करता है।
गोसुकीवि १४'१६

27

मैंने उनके बीच के अंतर को सारांश के साथ लेख लिखा और जो एक का उपयोग करते समय चुनने में मदद करता है।

शेयर स्थिति - जब var, परमाणु, एजेंट और रेफ का उपयोग करते हैं?

मुझे उम्मीद है कि यह लोगों को उस विषय में उत्तर तलाशने में मदद करेगा।

@Tunaci सुझाव के बाद लेख के कुछ शॉर्टकट:

Vars

वर्स हर धागे के लिए वैश्विक हैं।

बनाने के बाद वेरिएशन न बदलें। यह तकनीकी रूप से संभव है, लेकिन यह कई कारणों से बुरा है।

परमाणुओं

प्रत्येक थ्रेड के लिए उत्परिवर्तनीय स्थिति तक पहुँच साझा करें। परिवर्तन समकालिक रूप से होता है। जब अन्य थ्रेड रन के दौरान स्थिति बदलते हैं तो पुन: प्रयास करें।

लंबे समय के निष्पादन के साथ बेकार कार्यों और कार्यों का उपयोग न करें

एजेंटों

प्रत्येक थ्रेड के लिए उत्परिवर्तनीय स्थिति तक पहुँच साझा करें। परिवर्तन एसिंक्रोनस रूप से होता है।

refs

Refs डेटाबेस लेनदेन के समान काम करता है। लिखना और पढ़ना dosync में सुरक्षित है। आप लेन-देन में सुरक्षित कई रेफरी पर काम कर सकते हैं।

और फ्लोचार्ट जब कौन सा उपयोग करें: प्रवाह संचित्र

कृपया वेबसाइट पर छवि देखें, क्योंकि कुछ अपडेट हमेशा संभव हैं।

यह जटिल है और प्रतिलिपि और पिछले लेख के बिना पूर्ण उत्तर देने के लिए एक लंबा विषय है, इसलिए कृपया मुझे क्षमा करें, मैं आपको वेबसाइट पर पुनः निर्देशित करता हूं :)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.