Parallel.ForEach () बनाम foreach (IEnumerable <T> .As समानांतर ())


143

एर्ग, मैं बीसीएल में रिफ्लेक्टर का उपयोग करके इन दो तरीकों को खोजने की कोशिश कर रहा हूं, लेकिन उन्हें ढूंढ नहीं सकता। इन दो स्निपेट के बीच क्या अंतर है?

ए:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

बी:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

क्या एक के ऊपर एक प्रयोग करने के अलग-अलग परिणाम होते हैं? (मान लें कि मैं दोनों उदाहरणों के वर्ग निकायों में जो कुछ भी कर रहा हूं वह धागा सुरक्षित है।)

जवाबों:


148

वे कुछ अलग करते हैं।

पहले वाला अनाम प्रतिनिधि लेता है, और सभी अलग-अलग वस्तुओं के समानांतर इस कोड पर कई थ्रेड चलाता है।

दूसरा इस परिदृश्य में बहुत उपयोगी नहीं है। संक्षेप में, यह कई थ्रेड्स पर एक क्वेरी करने और परिणाम को संयोजित करने का इरादा रखता है, और इसे कॉलिंग थ्रेड पर फिर से देता है। इसलिए फॉर्च्यूमेंट स्टेटमेंट का कोड हमेशा UI थ्रेड पर रहता है।

यह केवल तभी समझ में आता है जब आप AsParallel()कॉल के दाईं ओर linq क्वेरी में कुछ महंगा करते हैं, जैसे:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));

केवल कम्प्यूटेबोनैचि पर एक समानांतर फ़ॉरेस्ट करने पर क्या लाभ है?
l -'''''''--------- '' '' '' '' '' '' '

51

अंतर है, बी समानांतर नहीं है। केवल एक चीज AsParallel()यह है कि यह एक के आसपास लपेटता है IEnumerable, ताकि जब आप LINQ विधियों का उपयोग करते हैं, तो उनके समानांतर वेरिएंट का उपयोग किया जाता है। रैपर GetEnumerator()(जो पर्दे के पीछे उपयोग किया जाता है foreach) भी मूल संग्रह के परिणाम देता है GetEnumerator()

BTW, अगर आप परावर्तक में तरीकों को देखने के लिए चाहते हैं, AsParallel()में है System.Linq.ParallelEnumerableमें वर्ग System.Coreविधानसभा। Parallel.ForEach()में है mscorlibविधानसभा (नाम स्थान System.Threading.Tasks)।


आप क्या मतलब है ... उनके समानांतर वेरिएंट का उपयोग किया जाता है ...?
l

2
@ विचलन, उदाहरण के लिए, जब आप लिखते हैं .Select(), तो यह कॉल करता है ParallelEnumerable.Select()और सामान्य नहीं Enumerable.Select()
15

50

दूसरा तरीका आपके उदाहरण में AsParallel () का उपयोग करने का सही तरीका समानांतर नहीं होगा

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});

3
केवल फ़ॉरेस्ट के बजाय फ़ॉरेस्ट के साथ asparallel के संयोजन का उपयोग क्यों करें?
l -''''''--------- '' '' '' '' '' '' '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.