2008-09-17 8 views
14

वायदा क्या हैं? यह आलसी मूल्यांकन के साथ कुछ करने के लिए है।वायदा क्या हैं?

+0

आलसी मूल्यांकन के साथ वायदा जरूरी नहीं है। वास्तव में बहुत से उपयोग के मामलों के लिए, आलसी वायदा ठीक वही है जो आपको चाहिए: आईओ, नेटवर्किंग, आदि ... – brice

+0

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

उत्तर

3

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

चूंकि भविष्य बदल दिया गया है, बाद के मूल्यांकन कोड को फिर से निष्पादित नहीं करते हैं, और केवल परिणाम प्राप्त करते हैं।

7

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

रुबी के लिए lazy.rb या Scala, futures, and lazy evaluation देखें।

शायद उन्हें थ्रेड के साथ किसी भी भाषा में कार्यान्वित किया जा सकता है, हालांकि यह उच्च स्तर की कार्यात्मक भाषा की तुलना में निम्न स्तर की भाषा जैसे सी में अधिक कठिन होगा।

+0

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

+1

@ 012 ...: मेरे द्वारा पोस्ट किए गए लिंक देखें, वे वायदा का एक अच्छा अवलोकन देते हैं। –

+2

http://en.wikipedia.org/wiki/Futures_and_promises#Distinction_between_futures_and_promises एक और अधिक निश्चित संदर्भ माना जाता है। (हा! विकिपीडिया!) सारांश: वायदा समवर्ती रूप से निष्पादित नहीं किया गया; अब कुछ उन्हें ऐसा करने के रूप में परिभाषित करते हैं, और मूल अवधारणा को एक वादा का नाम बदल चुके हैं। – 0124816

9

वायदा के बारे में Wikipedia article है। संक्षेप में, यह एक ऐसे मूल्य का उपयोग करने का एक तरीका है जिसे अभी तक ज्ञात नहीं है। मूल्य की गणना मांग (आलसी मूल्यांकन) और वैकल्पिक रूप से, मुख्य गणना के साथ समवर्ती रूप से की जा सकती है।

सी ++ उदाहरण निम्नानुसार है।


कहें कि आप दो संख्याओं की गणना करना चाहते हैं। आप या तो ठेठ उत्सुक कार्यान्वयन हो सकता है:

int add(int i, int j) { return i + j; } 
// first calculate both Nth_prime results then pass them to add 
int sum = add(Nth_prime(4), Nth_prime(2)); 

या आप जिस तरह से सी ++ 11 के std::async है, जो एक std::future रिटर्न का उपयोग कर वायदा उपयोग कर सकते हैं। इस मामले में, add फ़ंक्शन केवल तभी ब्लॉक करेगा जब वह उस मान का उपयोग करने का प्रयास करता है जिसे अभी तक गणना नहीं की गई है (कोई भी पूरी तरह से आलसी विकल्प भी बना सकता है)।

int add(future<int> i, future<int> j) { return i.get() + j.get(); } 
int sum = add(async(launch::async, [](){ return Nth_prime(4); }), 
       async(launch::async, [](){ return Nth_prime(2); })); 
6

हर कोई आलसी गणना के उद्देश्य के लिए वायदा का उल्लेख करता है। हालांकि विज्ञापन के रूप में नहीं जाने वाला एक अन्य उपयोग सामान्य रूप से आईओ के लिए वायदा का उपयोग है। विशेष रूप से वे फ़ाइलों को लोड करने और नेटवर्क डेटा पर प्रतीक्षा करने के लिए उपयोगी हैं

0

The Wiki Article वायदा का एक अच्छा अवलोकन देता है। अवधारणा आम तौर पर समवर्ती प्रणालियों में उपयोग की जाती है, उन मानों पर गणना को शेड्यूल करने के लिए जो अभी तक गणना की जा सकती हैं या नहीं, और आगे, जिनकी गणना पहले से ही प्रगति पर हो सकती है या नहीं।

लेख से

:

एक भविष्य एक विशिष्ट थ्रेड कि अपनी मूल्य की गणना के साथ जुड़ा हुआ है। यह गणना या तो उत्सुकता से शुरू हो सकती है जब भविष्य बनाया गया है, या आलसी है जब इसका मान पहले आवश्यक है।

लेख में वर्णित नहीं, वायदा एक Monad कर रहे हैं, और इसलिए यह इकाई में भविष्य मूल्यों पर काम करता है परियोजना के लिए उन्हें भविष्य मूल्य के लिए आवेदन किया है जब यह उपलब्ध हो जाता है, एक और भविष्य उपज संभव है जो बदले में उस समारोह के परिणाम का प्रतिनिधित्व करता है।

0

कुछ डिजाइन पैटर्न में विशेष रूप से वास्तविक समय पैटर्न के लिए वायदा का भी उपयोग किया जाता है, उदाहरण के लिए, ActiveObject पैटर्न, जो विधि निष्पादन से विधि आमंत्रण को अलग करता है। पूरा निष्पादन की प्रतीक्षा करने के लिए भविष्य सेटअप है। जब आप एक बहुप्रचारित वातावरण से एक थ्रेडेड वातावरण के साथ संवाद करने की आवश्यकता होती है तो मुझे यह देखने लगता है। ऐसे कई उदाहरण हो सकते हैं जहां हार्डवेयर के एक टुकड़े में थ्रेडिंग के लिए कर्नेल समर्थन नहीं है, और इस उदाहरण में वायदा का उपयोग किया जाता है। पहली नज़र में यह स्पष्ट नहीं है कि आप कैसे संवाद करेंगे, और आश्चर्यजनक रूप से वायदा इसे काफी सरल बनाते हैं। मुझे थोड़ा सी # कोड मिला है। मैं इसे खोदूँगा और इसे पोस्ट करूंगा।

0

This blog postबहुत अच्छी तरह से स्पष्टीकरण देता है कि उदाहरण के साथ आप भविष्य को कैसे कार्यान्वित कर सकते हैं। मैं वास्तव में इसकी सिफारिश करता हूं :)

+0

लिंक अब और काम नहीं करता है - चेतावनी: खाली मूल्य से डिफ़ॉल्ट ऑब्जेक्ट बनाना ... – mrwaim

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