2012-02-15 21 views
218

मेरे पास समानांतर है। फॉरएच() async लूप जिसके साथ मैं कुछ वेबपृष्ठ डाउनलोड करता हूं। मेरी बैंडविड्थ सीमित है इसलिए मैं प्रति बार केवल एक्स पेज डाउनलोड कर सकता हूं लेकिन समांतर। फॉरएच वांछित वेबपृष्ठों की पूरी सूची निष्पादित करता है।मैं समांतर को कैसे सीमित कर सकता हूं। फॉरएच?

समानांतर चलते समय थ्रेड नंबर या किसी अन्य limiter को सीमित करने का कोई तरीका है। फॉरएच?

डेमो कोड:

Parallel.ForEach(listOfWebpages, webpage => { 
    Download(webpage); 
}); 

वास्तविक कार्य वेबपेजों के साथ कोई संबंध नहीं है, तो रचनात्मक वेब रेंगने समाधान में मदद नहीं करेगा।

+5

मैं देख रहा हूँ आप एक सूची पर एक Parallel.ForEach() को क्रियान्वित कर रहे हैं - मैं भी रहना पसंद खतरनाक तरीके से। – jKlaus

+0

@jKlaus यदि सूची संशोधित नहीं है उदा। यह सिर्फ यूआरएल का एक सेट है, मैं वास्तव में इस मुद्दे को नहीं देख सकता? – Shiv

+0

@Shiv, आपको पर्याप्त समय दिया जाएगा ... निष्पादन की अपनी संख्या की गणना करें और इसकी गणना सूची की गिनती से करें। – jKlaus

उत्तर

394

आप एक ParallelOptions पैरामीटर में एक MaxDegreeOfParallelism निर्दिष्ट कर सकते हैं:

Parallel.ForEach(
    listOfWebpages, 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    webpage => { Download(webpage); } 
); 

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

+27

यह इस विशेष मामले पर लागू नहीं हो सकता है लेकिन मुझे लगा कि मैं इसे किसी के मामले में फेंक दूंगा इस पर आश्चर्य और इसे उपयोगी लगता है। यहां मैं प्रोसेसर गिनती का 75% (गोलाकार) का उपयोग कर रहा हूं। 'वर विकल्प चुनता = नए ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32 (Math.Ceiling ((Environment.ProcessorCount * 0,75) * 1,0)) };' – jKlaus

+2

बस किसी और दस्तावेज में उसे ढूंढने की होने को बचाने के लिए , '-1' का मान गुजरना उतना ही नहीं है जितना इसे बिल्कुल निर्दिष्ट नहीं करता है: _" यदि [मान] -1 है, समवर्ती चल रहे संचालन की संख्या पर कोई सीमा नहीं है "_ – stuartd

+0

यह मुझे स्पष्ट नहीं है प्रलेखन - मैक्सडेग्री ओफपेरेलिज्म को 4 (उदाहरण के लिए) पर सेट करने का मतलब है कि लूप पुनरावृत्तियों के प्रत्येक 1/4 वें (4 धागे के एक दौर को प्रेषित) के 4 थ्रेड होंगे, या प्रत्येक थ्रेड अभी भी एक लूप पुनरावृत्ति करता है और हम बस समानांतर में कितने रन सीमित? – Hashman

30

आप समवर्ती धागे की संख्या को सीमित करने के लिए ParallelOptions का उपयोग करें और MaxDegreeOfParallelism सेट कर सकते हैं:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});  
18

Parallel.Foreach का एक और ओवरलोड का उपयोग करें जो ParallelOptions उदाहरण लेता है, और MaxDegreeOfParallelism सेट करता है ताकि यह निर्धारित किया जा सके कि समानांतर में कितने उदाहरण निष्पादित होते हैं।

6

और VB.net उपयोगकर्ताओं (सिंटेक्स अजीब और खोजने के लिए मुश्किल है) के लिए ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage) 
......end sub) 
+0

इतना अजीब और प्रतीत होता है अनियंत्रित - धन्यवाद! –