2010-03-17 11 views
5

I recently asked कार्यात्मक कार्यक्रमों के बारे में कोई दुष्प्रभाव नहीं है, और सीखा है कि समांतर कार्यों को तुच्छ बनाने के लिए इसका क्या अर्थ है। विशेष रूप से, कि "शुद्ध" कार्य इस छोटे से बनाते हैं क्योंकि उनके पास कोई साइड इफेक्ट नहीं होता है।सी # "शुद्ध" में लैम्ब्डा अभिव्यक्ति/प्रतिनिधि हैं, या वे हो सकते हैं?

मैं हाल ही में LINQ और लैम्ब्डा अभिव्यक्तियों को देख रहा हूं क्योंकि मैंने स्टैक ओवरव्लो पर कई बार उदाहरणों में भाग लिया है। मुझे आश्चर्य हुआ कि क्या गणना या लूप समांतर करना सी # में अब "आसान" हो सकता है।

क्या लैम्ब्डा अभिव्यक्ति "शुद्ध" तुच्छ समानांतर को खींचने के लिए पर्याप्त हैं? हो सकता है कि यह इस बात पर निर्भर करता है कि आप अभिव्यक्ति के साथ क्या कर रहे हैं, लेकिन क्या वे पर्याप्त शुद्ध हो सकते हैं? कुछ इस तरह सी # में सैद्धांतिक रूप से संभव/तुच्छ होगा ?:

  • हिस्सा
  • भागो प्रत्येक हिस्सा
  • भागो एक समारोह है कि से मूल्य के साथ कुछ करता लूप करने के लिए एक धागा में पाश तोड़ प्रत्येक थ्रेड

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

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

उत्तर

17

सबसे पहले, ध्यान दें कि "शुद्ध" होने के लिए किसी विधि का कोई दुष्प्रभाव नहीं होना चाहिए। एक ही तर्क दिए जाने पर इसे हमेशा एक ही परिणाम वापस करना होगा। तो, उदाहरण के लिए, "Math.Sin" विधि शुद्ध है। आप 12 में भोजन करते हैं, यह आपको पाप वापस देता है (12) और यह हर बार एक ही है।एक विधि GetCurrentTime() शुद्ध नहीं है भले ही इसका कोई साइड इफेक्ट न हो; जब भी आप इसे कॉल करते हैं, तो यह एक अलग मूल्य देता है, इससे कोई फर्क नहीं पड़ता कि आप किस तर्क में गुजरते हैं।

यह भी ध्यान रखें कि एक शुद्ध विधि को वास्तव में अपवाद नहीं फेंकना चाहिए; अपवाद हमारे उद्देश्यों के लिए देखने योग्य साइड इफेक्ट्स के रूप में गिना जाता है।

दूसरा, हाँ, यदि आप किसी विधि की शुद्धता के बारे में तर्क दे सकते हैं तो आप इसे स्वचालित रूप से समानांतर करने के लिए दिलचस्प चीजें कर सकते हैं। समस्या यह है कि लगभग कोई विधि वास्तव में शुद्ध नहीं है। इसके अलावा, मान लीजिए कि आपके पास शुद्ध विधि है; चूंकि एक शुद्ध विधि ज्ञापन के लिए एक आदर्श उम्मीदवार है, और चूंकि ज्ञापन एक साइड इफेक्ट पेश करता है (यह कैश को बदलता है!) यह शुद्ध तरीके होना चाहिए और फिर उन्हें अशुद्ध बनाना बहुत आकर्षक है।

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

मुझे इन अवधारणाओं को सी # जैसी भाषाओं में जोड़ने का कोई तरीका पता होना अच्छा लगेगा, लेकिन यह पूरी तरह नीली आकाश खुली-शोध-समस्या सामग्री है; कोई वादा इरादा या निहित नहीं है।

13

लैम्ब्डा शुद्ध होना चाहिए। और फिर फ्रेमवर्क एक LINQ क्वेरी (PLINQ) के अतिरिक्त एक सरल .AsParallel के साथ स्वचालित पैरालाइजेशन प्रदान करता है।

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

+0

AsParallel देखें? इसके अलावा क्या है? सी # 4? या यह एक अलग डाउनलोड है? – Bob

+1

हाँ, क्षमा करें। PLINQ .NET 4 का हिस्सा है, 3.5 –

+0

+1 के लिए एक संस्करण (बीटा?) भी है कार्यात्मक प्रोग्रामिंग प्रोग्रामर पर अधिक जिम्मेदारियां प्रदान करता है। समांतर में निष्पादित किए जा सकने वाले कोड ब्लॉक की पहचान करना उनमें से एक है। जिज्ञासा से – Perpetualcoder

3

लैम्बडा शुद्ध है या नहीं, यह क्या कर रहा है उससे जुड़ा हुआ है। एक अवधारणा के रूप में यह न तो शुद्ध या अशुद्ध है।

उदाहरण के लिए: निम्नलिखित लैम्ब्डा अभिव्यक्ति अशुद्ध है क्योंकि यह शरीर में एक एकल चर को पढ़ और लिख रही है। समानांतर में इसे चलाने से दौड़ की स्थिति पैदा होती है।

var i = 0; 
Func<bool> del =() => { 
    if (i == 42) { return true; } 
    else (i++) { return false; } 
}; 

आमतौर पर निम्नलिखित प्रतिनिधि शुद्ध है और इसमें कोई दौड़ की स्थिति नहीं है।

Func<bool> del =() => true; 
3

पाश भाग के लिए के रूप में, आप भी Parallel.For और Parallel.ForEach एक खेल में वस्तुओं के बारे में उदाहरण के लिए इस्तेमाल कर सकते हैं। यह .NET 4 का भी हिस्सा है, लेकिन आप इसे डाउनलोड के रूप में प्राप्त कर सकते हैं।

2

.NET 4.0 here में नए समांतरता समर्थन के बारे में चर्चा करने वाले 13 भाग हैं। इसमें LINQ और PLINQ पर भी भाग 7 में चर्चा शामिल है। यह एक महान पढ़ा गया है, इसलिए इसे

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

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