62

कम से कम .NET 4.0 के रिलीज के बाद, माइक्रोसॉफ्ट ने समानांतर और असीमित प्रोग्रामिंग के लिए समर्थन में बहुत प्रयास किए हैं और ऐसा लगता है कि इसके आसपास कई एपीआई और पुस्तकालय उभरे हैं। विशेष रूप से निम्नलिखित फैंसी नाम लगातार हर जगह हाल ही में उल्लेख कर रहे हैं:प्रतिक्रियाशील फ्रेमवर्क, पीआईएनक्यू, टीपीएल और समांतर एक्सटेंशन कैसे एक दूसरे से संबंधित हैं?

  • रिएक्टिव फ्रेमवर्क,
  • PLINQ (समांतर LINQ),
  • TPL (टास्क समानांतर लाइब्रेरी) और
  • समानांतर एक्सटेंशन।

अब वे सभी Microsoft उत्पादों होने लगते हैं और वे सब नेट के लिए अतुल्यकालिक या समानांतर प्रोग्रामिंग परिदृश्यों को लक्षित करने के लग रहे हैं। लेकिन यह बिल्कुल स्पष्ट नहीं है कि उनमें से प्रत्येक वास्तव में क्या है और वे एक-दूसरे से कैसे जुड़े हैं। कुछ वास्तव में एक ही बात हो सकती है।

कुछ शब्दों में, क्या कोई रिकॉर्ड सीधे सेट कर सकता है कि क्या है?

+0

मैंने इस प्रश्न को थोड़ा सा स्पष्ट करने की कोशिश करने के लिए संपादित किया है, और इसे फिर से खोलने के लिए वोट दिया है। उस ने कहा, मैं एक .NET विशेषज्ञ नहीं हूं, इसलिए मैंने इसका गड़बड़ कर दिया होगा; अगर आपको लगता है कि मैंने कहीं गलती की है तो इसे और संपादित करने के लिए स्वतंत्र महसूस करें (या यहां तक ​​कि मेरे परिवर्तनों को पूरी तरह से वापस करें)। इसके अलावा, स्पष्ट रूप से, मुझे अभी भी लगता है कि यह सवाल * लगता है * बहुत व्यापक और अस्पष्ट स्टैक ओवरफ्लो पर फिट करने के लिए अस्पष्ट; उन्होंने कहा, यह देखते हुए कि यह एक अत्यधिक उत्साही और स्वीकार्य उत्तर है, मैं स्वीकार करने के लिए तैयार हूं कि यह एक अपवाद हो सकता है। –

+0

मैं तर्क था कि ** हर कोई ** जो ऊपर 4 बातें जानता है (है कि हर कोई होगा जो संभवतः इस सवाल का जवाब कर सकते हैं) में जाना जाता है | ** तुरंत ** क्या इस सवाल के बारे में सब है। उपरोक्त और उत्तर साबित करते हैं कि। वैसे भी मैंने सवाल संपादित किया है ताकि यह यथासंभव स्पष्ट हो। – bitbonk

उत्तर

93

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 के भार के उजागर करता है। InvokeThreadPool में कतारबद्ध कार्यों की तरह थोड़ा सा है, लेकिन उपयोग करने के लिए थोड़ा आसान है। आईएमओ, अधिक रोचक बिट 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 में उपलब्ध हैं। ज़ाहिर है, ज़ाहिर है, लेकिन ये वे थे जिन्हें आपने पूछा था!

+0

इनमें से कोई भी .NET 3.5 या उससे कम में उपलब्ध है? – Myster

+1

@ माइस्टर: आरएक्स उपलब्ध है (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx)। पीआईएलक्यू एक लंबे समय पहले एक सीटीपी के रूप में उपलब्ध था लेकिन अब पेश नहीं किया गया है - आपको इसके लिए अपग्रेड करना होगा। – Aaronaught

+2

सीपी एसिंक सीटीपी के साथ आया टीपीएल डेटाफ्लो लाइब्रेरी (टीडीएफ) वास्तव में अच्छा लग रहा है। इसे समानांतर प्रसंस्करण के 'प्रदर्शन मीठे स्थान' के भीतर रहने के लिए .NET मिडलवेयर के लिए इसे अधिक आसान बनाना चाहिए। सर्वश्रेष्ठ प्रदर्शन (थ्रूपुट और विलंबता पर विचार करने के लिए) आप सीमा निर्धारित करते हैं। तो प्रसंस्करण के प्रत्येक 'ब्लॉक' में इसका स्वयं का 'बफर कैप' हो सकता है और इसमें समांतरता टोपी हो सकती है। आप अलग-अलग संदेशों की बजाय बैच को संसाधित करने के लिए प्रत्येक ब्लॉक को भी बता सकते हैं। यह बहुत अच्छा लग रहा है। – yzorg

28

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

लेकिन टीपीएल और आरएक्स दो अलग-अलग समस्याओं को हल करता है। टीपीएल सबसे अच्छा काम करता है जब प्रोग्राम या एल्गोरिदम '& क्यूइंग खींच रहा है'। आरएक्स एक्सेल करता है जब प्रोग्राम या एल्गोरिदम को स्ट्रीम से डेटा पर 'प्रतिक्रिया' करने की आवश्यकता होती है (जैसे माउस इनपुट या डब्ल्यूसीएफ जैसे एंडपॉइंट से संबंधित संदेशों की स्ट्रीम प्राप्त करते समय)।

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

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

औसत डेवलपर उनके सिर इरादों आप Rx के साथ व्यक्त कर सकते हैं के सेट के चारों ओर लिपटा प्राप्त कर सकते हैं या नहीं अभी तक देखने की बात है। :)

लेकिन मुझे लगता है कि अगले कुछ वर्षों TPL बनाम आरएक्स LINQ करने वाली एसक्यूएल बनाम इकाई की रूपरेखा की तरह अगले बहस होने जा रहा है। एक ही डोमेन में एपीआई के दो स्वाद हैं और विभिन्न परिदृश्यों के लिए विशिष्ट हैं लेकिन कई तरीकों से ओवरलैप हैं। लेकिन TPL & आरएक्स के मामले में वे वास्तव में एक दूसरे के बारे में पता कर रहे हैं और वहाँ में निर्मित एडेप्टर अनुप्रयोगों लिखें और दोनों व्यवस्थाएं एक साथ (एक IObservable आरएक्स धारा में एक PLINQ पाश से खिला परिणाम की तरह) का उपयोग कर रहे हैं। उन लोगों के लिए जिन्होंने समानांतर प्रोग्रामिंग नहीं की है, गति तक पहुंचने के लिए सीखने का एक टन है।

अद्यतन: मैं अपने नियमित काम में दोनों TPL और RxNet का उपयोग कर पिछले 6 महीनों के लिए (18 महीने के अपने मूल जवाब के बाद से)। एक मध्य-स्तरीय डब्ल्यूसीएफ सेवा (एंटरप्राइज़ LOB सेवा) में टीपीएल और/या आरएक्सनेट की पसंद के मेरे विचार: http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html

+1

ध्यान देने योग्य एक और बात यह है कि टीपीएल और टीपीएल डेटाफ्लो यह मानते हुए शुरू करते हैं कि आप समांतर प्रसंस्करण चाहते हैं। डिफ़ॉल्ट रूप से आरएक्स 'समृद्ध घटनाओं' के रूप में शुरू होता है, इसलिए यह आपको समांतर प्रसंस्करण करने के लिए हुप्स के माध्यम से कूदता है (जैसे समानांतर में संसाधित समवर्ती वस्तुओं की संख्या में वृद्धि)। देखें ["IObservable के रूप में थ्रेड सुरक्षित के रूप में सोचें"] (http://stackoverflow.com/a/13524931/195755) और ["आरएक्स का उपयोग करते हुए कतार को असंक्रमित रूप से कैसे संसाधित करें"] (http://stackoverflow.com/a/6552193/195,755)। यह भी मेरी राय में बहुत आसान है [गलती से आरएक्स में अवरुद्ध संचालन का उपयोग करें] (http://stackoverflow.com/a/2394305/195755)। – yzorg

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