PLINQ (समांतर Linq) केवल नियमित LINQ क्वेरी लिखने के लिए इतना है कि वे समानांतर में चलाने के लिए एक नया तरीका है - दूसरे शब्दों में, फ्रेमवर्क स्वचालित रूप से एक से अधिक थ्रेड भर में अपने क्वेरी चलाने का ख्याल रखना होगा, ताकि वे तेज़ी से समाप्त (यानी एकाधिक सीपीयू कोर का उपयोग करना)।
उदाहरण के लिए, मान लीजिए कि आपके पास तारों का एक गुच्छा है और आप "ए" अक्षर से शुरू होने वाले सभी को प्राप्त करना चाहते हैं। आप अपनी क्वेरी इस तरह लिख सकते हैं:
var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));
और यह ठीक काम करता है। सब आप एक नियमित क्वेरी चालू करने के लिए क्या करना है कि
var myWords = words.AsParallel().Select(s => s.StartsWith("A"));
: आप 50,000 शब्दों खोज करने के लिए था, हालांकि, आप कई कोर भर में तथ्य यह है कि प्रत्येक परीक्षा स्वतंत्र है का लाभ लेने के लिए, और विभाजित करने के लिए इस चाहते हो सकता है एक समानांतर में जो एकाधिक कोर पर चलता है। काफी साफ़।
TPL (टास्क समानांतर लाइब्रेरी) PLINQ को पूरक की तरह है, और वे एक साथ समानांतर एक्सटेंशन बनाते हैं। जबकि PLINQ बड़े पैमाने पर कार्यात्मक दुष्प्रभावों के साथ प्रोग्रामिंग की शैली पर आधारित है, साइड इफेक्ट्स ठीक उसी प्रकार हैं जो टीपीएल के लिए है। यदि आप वास्तव में समानांतर में चीजों को खोजने/चुनने के विपरीत समानांतर में काम करना चाहते हैं, तो आप टीपीएल का उपयोग करते हैं।
TPL अनिवार्य रूप से Parallel
वर्ग जो For
, Foreach
, और Invoke
के भार के उजागर करता है। Invoke
ThreadPool
में कतारबद्ध कार्यों की तरह थोड़ा सा है, लेकिन उपयोग करने के लिए थोड़ा आसान है। आईएमओ, अधिक रोचक बिट For
और Foreach
हैं। तो उदाहरण के लिए मान लें कि आपके पास उन फ़ाइलों का पूरा समूह है जिन्हें आप संपीड़ित करना चाहते हैं। आप नियमित अनुक्रमिक संस्करण लिख सकते हैं:
string[] fileNames = (...);
foreach (string fileName in fileNames)
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
}
फिर से, इस संपीड़न का प्रत्येक पुनरावृत्ति किसी अन्य से पूरी तरह से स्वतंत्र है।हम एक बार में उनमें से कई कार्य करके यह तेजी लाने के कर सकते हैं:
Parallel.ForEach(fileNames, fileName =>
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
});
और फिर, कि यह सब इस आपरेशन parallelize लेता है। अब जब हम CompressFiles
विधि (या जिसे हम इसे कॉल करने का निर्णय लेते हैं) चलाते हैं, तो यह कई सीपीयू कोर का उपयोग करेगा और शायद समय में आधे या 1/4 वें स्थान पर होगा।
इसका लाभ ThreadPool
में बस इसे चकित करने का लाभ यह है कि यह वास्तव में सिंक्रनाइज़ चलाता है। आप ThreadPool
बजाय (या पूरी तरह से Thread
उदाहरण) का इस्तेमाल किया है, तो आप यह जानने जब कार्यों के सभी काम पूरा हो जाने का एक रास्ता साथ आने के लिए होगा, और जब तक इस नहीं है बहुत जटिल, यह कुछ है कि एक बहुत से लोग खराब हो जाते हैं या कम से कम परेशानी होती है। जब आप Parallel
कक्षा का उपयोग करते हैं, तो आपको वास्तव में इसके बारे में सोचना नहीं पड़ता है; बहु थ्रेडिंग पहलू आप से छिपा हुआ है, यह सभी दृश्यों के पीछे संभाला गया है।
रिएक्टिव एक्सटेंशन (आरएक्स) वास्तव में एक अलग जानवर पूरी तरह कर रहे हैं। इवेंट हैंडलिंग के बारे में सोचने का यह एक अलग तरीका है। इस पर कवर करने के लिए वास्तव में बहुत सारी सामग्री है, लेकिन इवेंट हैंडलर को घटनाओं में तारों की बजाय लंबी कहानी बनाने के लिए, आरएक्स आपको घटनाओं के अनुक्रमों का इलाज करने देता है ... ठीक है, अनुक्रम (IEnumerable<T>
)। आप यादृच्छिक समय पर अतुल्यकालिक रूप से निकाल दिए जाने के बजाए एक पुनरावृत्ति फैशन में ईवेंट को संसाधित करते हैं, जहां आपको किसी विशेष क्रम में होने वाली घटनाओं की एक श्रृंखला का पता लगाने के लिए हर समय बचत स्थिति रखना होता है।
आरएक्स के सबसे अच्छे उदाहरणों में से एक here है। "लिंक से IOervervable" अनुभाग पर जाएं जहां वह ड्रैग-एंड-ड्रॉप हैंडलर लागू करता है, जो आमतौर पर कोड की केवल 4 पंक्तियों में डब्ल्यूपीएफ में दर्द होता है। आरएक्स आपको घटनाओं के की घटनाओं देता है, जो आपके पास वास्तव में नियमित ईवेंट हैंडलर के साथ नहीं है, और इन जैसे कोड स्निपेट भी उन व्यवहार वर्गों में प्रतिक्रिया करने के लिए सरल हैं जिन्हें आप कहीं भी आस्तीन कर सकते हैं।
और यही वह है। ये कुछ कूलर विशेषताएं हैं जो .NET 4.0 में उपलब्ध हैं। ज़ाहिर है, ज़ाहिर है, लेकिन ये वे थे जिन्हें आपने पूछा था!
मैंने इस प्रश्न को थोड़ा सा स्पष्ट करने की कोशिश करने के लिए संपादित किया है, और इसे फिर से खोलने के लिए वोट दिया है। उस ने कहा, मैं एक .NET विशेषज्ञ नहीं हूं, इसलिए मैंने इसका गड़बड़ कर दिया होगा; अगर आपको लगता है कि मैंने कहीं गलती की है तो इसे और संपादित करने के लिए स्वतंत्र महसूस करें (या यहां तक कि मेरे परिवर्तनों को पूरी तरह से वापस करें)। इसके अलावा, स्पष्ट रूप से, मुझे अभी भी लगता है कि यह सवाल * लगता है * बहुत व्यापक और अस्पष्ट स्टैक ओवरफ्लो पर फिट करने के लिए अस्पष्ट; उन्होंने कहा, यह देखते हुए कि यह एक अत्यधिक उत्साही और स्वीकार्य उत्तर है, मैं स्वीकार करने के लिए तैयार हूं कि यह एक अपवाद हो सकता है। –
मैं तर्क था कि ** हर कोई ** जो ऊपर 4 बातें जानता है (है कि हर कोई होगा जो संभवतः इस सवाल का जवाब कर सकते हैं) में जाना जाता है | ** तुरंत ** क्या इस सवाल के बारे में सब है। उपरोक्त और उत्तर साबित करते हैं कि। वैसे भी मैंने सवाल संपादित किया है ताकि यह यथासंभव स्पष्ट हो। – bitbonk