2013-06-03 5 views
16

मैंने हाल ही में कार्यात्मक भाषाओं के बारे में बहुत कुछ पढ़ा है। चूंकि वे केवल अपरिवर्तनीय संरचनाओं का उपयोग करते हैं, वे दावा करते हैं कि समेकन के मुद्दों में काफी सुधार/हल किया गया है। मुझे कुछ गंभीर परेशानी हो रही है कि यह वास्तव में वास्तविक जीवन संदर्भ में कैसे वितरित किया जा सकता है। आइए मान लें कि हमारे पास एक बंदरगाह पर एक थ्रेड के साथ एक वेब सर्वर है (ठीक है, आईओ एक और चीज है जिसके बारे में मुझे अपने सिर को लपेटने में कठिनाई होती है लेकिन चलो बस इसे अभी अनदेखा करें); किसी भी कनेक्शन प्रयास पर सॉकेट बनाया जाता है और एक नए बनाए गए धागे को पास किया जाता है जो कुछ काम करता है और प्राप्त संचार के आधार पर, एक बड़ी सूची/डेटा संरचना में परिवर्तन लागू कर सकता है जो सर्वर अनुप्रयोग के लिए वैश्विक है। तो, सूची के निरंतर दृश्य वाले सभी धागे के लिए यह सूची कैसे काम करती है (या कम से कम एक धागे द्वारा किए गए सभी परिवर्तनों को सूची में लागू होने के तुरंत बाद जैसे ही धागे सही तरीके से मर जाता है) ?अपरिवर्तनीय/लगातार प्रकार और डेटा संरचनाओं का उपयोग करते हुए समेकन कैसे काम करता है?

मेरी समझ समस्याएं हैं:

  • जाहिर है किसी भी धागे पर काम करने के लिए सूची का एक अपरिवर्तनीय "स्नैपशॉट" मिल सकती है। हालांकि, लागू परिवर्तनों के साथ सूची का एक नया संस्करण बनाकर सामग्री को "बदलना" के बाद, हम अभी भी सूची के अपने संस्करण वाले प्रत्येक थ्रेड के साथ छोड़ दिए गए हैं। वे एक साथ वापस विलय कैसे कर रहे हैं?
  • एक अन्य विधि में पारंपरिक लॉकिंग तंत्र जैसे म्यूटेक्स/कंड या गो-जैसे-चैनल का उपयोग करना शामिल हो सकता है। हालांकि, आप इस तरह की चीज कैसे बना सकते हैं जब सभी चर अपरिवर्तनीय हों?
  • मैं एसटीएम के बारे में सुना है, लेकिन है कि साइड इफेक्ट के साथ सौदा नहीं कर सकते हैं (यानी अगर सूची होगा भी पारदर्शी रूप से बैकअप किसी फ़ाइल या db डेटा)

तो आपको कैसे ऐसी बात एक में मॉडल हैं कार्यात्मक भाषा?

+0

अंतर्निहित अवधारणाओं के बारे में एक अच्छी बात है http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey – buritos

+2

पहले से ही देखा गया है कि एक बार 2 बार दुर्भाग्यवश, अभी भी इसे प्राप्त नहीं किया गया है। कार्यात्मक प्रोग्रामिंग के साथ सबसे बड़ी समस्याएं 1) अधिकांश लोगों ने अनिवार्य भाषाओं को सीखा और प्रशिक्षित किया है 2) कार्यात्मक भाषाओं को एक अलग तरीके से सोचने की आवश्यकता होती है 3) कोई संसाधन संसाधन प्रोग्रामिंग प्रोग्रामिंग नहीं कर रहे हैं जो विशेष रूप से 99% (= अनिवार्य प्रोग्रामिंग लोगों) पर लक्षित हैं) अविश्वसनीय रूप से तुच्छ उदाहरणों को छोड़कर – Askaga

+0

Thats जहां से मैं भी आ रहा हूं और यह आसान नहीं है। मैं जवाब देने की कोशिश से शुरू करूंगा कि थ्रेड को अन्य धागे के साइड इफेक्ट्स को पढ़ने की आवश्यकता क्यों है। मैंने अभी अपनी यात्रा शुरू कर दी है और यही कारण है कि मैं जवाब देने की कोशिश नहीं करता, मुझे यकीन है कि यहां जवाब देने के लिए यहां अधिक योग्यता प्राप्त व्यक्ति हैं :-) – buritos

उत्तर

17

अपरिवर्तनीय मूल्यों में कई एप्लिकेशन हैं जिनके लिए वे उपयुक्त हैं। समवर्ती/समांतर प्रसंस्करण उनमें से केवल एक है जो हाल ही में अधिक महत्वपूर्ण हो गया है। निम्नलिखित अनुभव और कई किताबें और विषय के बारे में वार्ता से वास्तव में सबसे बुनियादी पाचन है। आपको कुछ अंततः गोता लगाने की आवश्यकता हो सकती है।

जो मुख्य उदाहरण आप यहां दिखाते हैं वह वैश्विक स्थिति के प्रबंधन के बारे में है, इसलिए इसे पूरी तरह से "अपरिवर्तनीय" नहीं किया जा सकता है। हालांकि, यहां तक ​​कि अपरिवर्तनीय डेटा संरचनाओं का उपयोग करने के बहुत अच्छे कारण भी हैं। मेरे सिर के ऊपर से उन में से कुछ:

  • कोशिश - पकड़ काफी बेहतर व्यवहार करती है, क्योंकि आप साझा नहीं किया तो संशोधित करें उद्देश्य यह है कि संशोधित आधे रास्ते छोड़ा जा सकता है, अपरिवर्तनीय मूल्यों के साथ, यह स्वतः ही पिछले लगातार राज्य रहता
  • वैश्विक चर के बहुत सीमित सेट (आदर्श एक) पर बस मल्टीकोर सुरक्षित "तुलना-और-स्वैप" संचालन के लिए बदलती स्थिति को कम करने, पूरी तरह से डेडलॉक्स को हटा देता है
  • किसी भी रक्षात्मक प्रतिलिपि के बिना डेटा संरचनाओं का मुफ्त उत्तीर्ण होना जो अक्सर होता है भूल गए रहस्यमय बग (कई बार रक्षात्मक प्रतियां दोनों कॉलिंग और फ़ंक्शंस कॉल में बनाई जाती हैं, क्योंकि डेवलपर्स "माफ की तुलना में बेहतर सुरक्षित" fter डिबगिंग सत्र के एक जोड़े)
  • बहुत आसान इकाई परीक्षण, क्योंकि कई कार्यों अपरिवर्तनीय मूल्यों पर काम पक्ष प्रभाव मुक्त
  • आमतौर पर आसान क्रमबद्धता और अधिक पारदर्शी तुलना अर्थ विज्ञान बहुत आसान डिबगिंग और ले जा रही है (प्रवेश) एक वर्तमान स्नैपशॉट हैं सिस्टम स्थिति का भी असीमित रूप से

हालांकि आपके प्रश्न पर वापस जाएं।

सबसे मामूली मामले में इस मामले में वैश्विक स्थिति को अक्सर एक अपरिवर्तनीय डेटा संरचना पर शीर्ष होल्डिंग पर एक उत्परिवर्तनीय संदर्भ का उपयोग करके मॉडलिंग किया जाता है।

संदर्भ केवल सीएएस परमाणु संचालन द्वारा अद्यतन किया जाता है।

अपरिवर्तनीय डेटा संरचना एक दुष्प्रभाव मुक्त कार्यों द्वारा परिवर्तित की जाती है और जब सभी परिवर्तन किए जाते हैं तो संदर्भ परमाणु रूप से बदल दिया जाता है।

यदि दो धागे/कोर एक साथ स्वैप करना चाहते हैं तो एक ही पुराने से नए मूल्य मिलते हैं, जो पहले जीतता है वह दूसरा सफल नहीं होता है (सीएएस अर्थशास्त्र) और ऑपरेशन को दोहराने की जरूरत है (रूपांतरण पर निर्भर करता है, या तो मौजूदा मूल्य को नए मान के साथ अपडेट करना, या शुरुआत से नए मान को बदलना)। यह अपर्याप्त प्रतीत हो सकता है, लेकिन यहां धारणा यह है कि कुछ काम फिर से करना स्थायी लॉकिंग/सिंक्रनाइज़ेशन ओवरहेड से अक्सर सस्ता होता है।

बेशक इसे अनुकूलित किया जा सकता है उदा। अप्रत्याशित डेटा संरचनाओं के स्वतंत्र हिस्सों को विभाजित करके संभावित टकरावों को और कम करने के लिए स्वतंत्र रूप से अद्यतन किए जा रहे हैं।

डेटा संरचना तक पहुंच लॉक-फ्री और बहुत तेज है और हमेशा एक सतत प्रतिक्रिया देता है। एज केस जैसे कि जब आप एक अपडेट भेजते हैं और किसी अन्य क्लाइंट को बाद में पुराने डेटा प्राप्त होते हैं, तो किसी भी सिस्टम में उम्मीद की जा सकती है, क्योंकि नेटवर्क अनुरोध भी ऑर्डर से बाहर हो सकते हैं ...

एसटीएम काफी दुर्लभ है और आमतौर पर आप बेहतर होते हैं डेटा संरचना के परमाणु स्वैप का उपयोग करने के लिए उन संदर्भों से सभी मान शामिल हैं जिनका उपयोग आप एसटीएम लेनदेन में करेंगे।

+1

बहुत अच्छा जवाब। कार्यात्मक प्रोग्रामिंग के बारे में अधिकांश ट्यूटोरियल में पूरी तरह से अनदेखा (या बुरी तरह समझाया गया) चीजों के बारे में बहुत सारी जानकारी प्रदान करता है। – Askaga

+1

धन्यवाद। मैं अपरिवर्तनीय डेटा के संबंध में विलय की समस्या का उत्तर खोजने के लिए अब दिनों के लिए इंटरवेब्स खोज रहा हूं। अधिकांश संसाधन किसी भी विचार को मंत्रमुग्ध रूप से दोहराएंगे "[...] थ्रेड-सुरक्षित है और इसलिए परिवर्तनों को वापस विलय करने की बहुत कठिन समस्या के बिना" सहमति के साथ मदद करता है "। – aefxx

+0

यदि हम किसी प्रकार के मानचित्र-जैसी डेटा संरचना का उदाहरण लेते हैं। यदि यह नक्शा जैसी संरचना अपरिवर्तनीय थी, और हम चाहते थे कि यह समवर्ती भी हो, तो इसका मतलब यह नहीं होगा कि प्रत्येक कुंजी-मूल्य जोड़ी को समवर्ती लिखने के दौरान एक स्वतंत्र सीएएस ऑपरेशन होना होगा? – CMCDragonkai

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