70

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

यदि मैं अनुक्रमिक दृष्टिकोण का उपयोग करता हूं, तो बड़ी संख्या में संसाधनों को देखते हुए, उन सभी को संसाधित करने में काफी समय लगता है (नेटवर्क समस्याओं और इसी तरह की सामग्री के कारण);

foreach(feed in feeds) 
{ 
    read_from_web(feed) 
    parse(feed) 
} 

तो मैं संगामिति लागू करना चाहते हैं और अगर मैं मूल रूप से ThreadPools का उपयोग कार्यकर्ता धागे के साथ कार्रवाई करने के लिए चाहिए या सिर्फ TPL पर भरोसा करते हैं यह हल कर पाने के लिए तय नहीं कर सका।

निश्चित रूप से थ्रेडपूल कार्यकर्ता धागे के साथ मेरे लिए नौकरी संभालेगा और मुझे वह उम्मीद मिलेगी जो मैं उम्मीद करता हूं (और बहु-कोर CPU वातावरण में, अन्य कोर भी उपयोग किए जाएंगे)।

concurrency

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

तो आईओ-बाउंड ऑपरेशंस (मेरे मामले में वेब से संसाधन पढ़ने में) के लिए, क्या थ्रेडपूल का उपयोग करना और चीजों को नियंत्रित करना सबसे अच्छा है, या बस टीपीएल पर भरोसा करना बेहतर है? क्या आईपी-बाध्य परिदृश्य में टीपीएल भी इस्तेमाल किया जा सकता है?

अद्यतन: मेरी मुख्य चिंता यह है कि - TPL एक एकल कोर सीपीयू पर्यावरण पर सिर्फ अनुक्रमिक दृष्टिकोण की तरह व्यवहार करेगा या यह अभी भी संगामिति की पेशकश करेगा? मैं पहले से ही Parallel Programming with Microsoft .NET पढ़ रहा हूं और इसलिए book लेकिन इसके लिए सटीक उत्तर नहीं मिला।

नोट: यह मेरे पिछले प्रश्न [Is it possible to use thread-concurrency and parallelism together?] का पुन: phrasing है जो काफी गलत गलत था।

उत्तर

100

इसलिए मैंने इसके लिए परीक्षण लिखने और व्यावहारिक डेटा पर देखने का फैसला किया।

टेस्ट लीजेंड

  • Itr: पुनरावृत्ति
  • Seq: अनुक्रमिक दृष्टिकोण।
  • PrlEx: समानांतर एक्सटेंशन - Parallel.ForEach
  • TPL: टास्क समानांतर लाइब्रेरी
  • TPool: ThreadPool

टेस्ट

परिणाम

सिंगल-कोर सीपीयू [Win7-32] - - वीएमवेयर के तहत चलता है -

Test Environment: 1 physical cpus, 1 cores, 1 logical cpus. 
Will be parsing a total of 10 feeds. 
________________________________________________________________________________ 

Itr. Seq. PrlEx TPL  TPool 
________________________________________________________________________________ 

#1  10.82s 04.05s 02.69s 02.60s 
#2  07.48s 03.18s 03.17s 02.91s 
#3  07.66s 03.21s 01.90s 01.68s 
#4  07.43s 01.65s 01.70s 01.76s 
#5  07.81s 02.20s 01.75s 01.71s 
#6  07.67s 03.25s 01.97s 01.63s 
#7  08.14s 01.77s 01.72s 02.66s 
#8  08.04s 03.01s 02.03s 01.75s 
#9  08.80s 01.71s 01.67s 01.75s 
#10  10.19s 02.23s 01.62s 01.74s 
________________________________________________________________________________ 

Avg. 08.40s 02.63s 02.02s 02.02s 
________________________________________________________________________________ 

सिंगल-कोर सीपीयू [WinXP] - VMWare के तहत रन -

Test Environment: 1 physical cpus, NotSupported cores, NotSupported logical cpus. 
Will be parsing a total of 10 feeds. 
________________________________________________________________________________ 

Itr. Seq. PrlEx TPL  TPool 
________________________________________________________________________________ 

#1  10.79s 04.05s 02.75s 02.13s 
#2  07.53s 02.84s 02.08s 02.07s 
#3  07.79s 03.74s 02.04s 02.07s 
#4  08.28s 02.88s 02.73s 03.43s 
#5  07.55s 02.59s 03.99s 03.19s 
#6  07.50s 02.90s 02.83s 02.29s 
#7  07.80s 04.32s 02.78s 02.67s 
#8  07.65s 03.10s 02.07s 02.53s 
#9  10.70s 02.61s 02.04s 02.10s 
#10  08.98s 02.88s 02.09s 02.16s 
________________________________________________________________________________ 

Avg. 08.46s 03.19s 02.54s 02.46s 
________________________________________________________________________________ 

डुअल-कोर सीपीयू [Win7-64]

Test Environment: 1 physical cpus, 2 cores, 2 logical cpus. 
Will be parsing a total of 10 feeds. 
________________________________________________________________________________ 

Itr. Seq. PrlEx TPL  TPool 
________________________________________________________________________________ 

#1  07.09s 02.28s 02.64s 01.79s 
#2  06.04s 02.53s 01.96s 01.94s 
#3  05.84s 02.18s 02.08s 02.34s 
#4  06.00s 01.43s 01.69s 01.43s 
#5  05.74s 01.61s 01.36s 01.49s 
#6  05.92s 01.59s 01.73s 01.50s 
#7  06.09s 01.44s 02.14s 02.37s 
#8  06.37s 01.34s 01.46s 01.36s 
#9  06.57s 01.30s 01.58s 01.67s 
#10  06.06s 01.95s 02.88s 01.62s 
________________________________________________________________________________ 

Avg. 06.17s 01.76s 01.95s 01.75s 
________________________________________________________________________________ 

क्वाड-कोर सीपीयू [Win7 -64] - HyprerThreading समर्थित -

Test Environment: 1 physical cpus, 4 cores, 8 logical cpus. 
Will be parsing a total of 10 feeds. 
________________________________________________________________________________ 

Itr. Seq. PrlEx TPL  TPool 
________________________________________________________________________________ 

#1  10.56s 02.03s 01.71s 01.69s 
#2  07.42s 01.63s 01.71s 01.69s 
#3  11.66s 01.69s 01.73s 01.61s 
#4  07.52s 01.77s 01.63s 01.65s 
#5  07.69s 02.32s 01.67s 01.62s 
#6  07.31s 01.64s 01.53s 02.17s 
#7  07.44s 02.56s 02.35s 02.31s 
#8  08.36s 01.93s 01.73s 01.66s 
#9  07.92s 02.15s 01.72s 01.65s 
#10  07.60s 02.14s 01.68s 01.68s 
________________________________________________________________________________ 

Avg. 08.35s 01.99s 01.75s 01.77s 
________________________________________________________________________________ 

संक्षेपण

  • आप एक सिंगल-कोर पर्यावरण या एक मल्टी कोर एक, समानांतर एक्सटेंशन पर चला रहे हों, TPL और ThreadPool ही व्यवहार करती है और अनुमानित परिणाम देता है।
  • फिर भी TPLफायदे आसान अपवाद संचालन रद्द समर्थन और आसानी से वापस जाने के लिए टास्क परिणाम क्षमता की तरह है। हालांकि समांतर एक्सटेंशन भी एक और व्यवहार्य विकल्प है। पर

चल रहा है परीक्षण अपनी खुद की

आप स्रोत here डाउनलोड करने और ऑन-अपने-खुद चला सकते हैं। यदि आप परिणाम पोस्ट कर सकते हैं, तो मैं उन्हें भी जोड़ दूंगा।

अपडेट: स्रोत लिंक फिक्स्ड।

+6

+1 वैज्ञानिक दृष्टिकोण का उपयोग करके अपनी समस्या को हल करने के लिए। अगर मुझे गलत नहीं लगता है, तो उपर्युक्त सभी तकनीकें थ्रेड पूल का उपयोग करती हैं, जो समान परिणामों को बताती है। आम तौर पर मुझे समांतर एक्सटेंशन का उपयोग करना पसंद है क्योंकि वाक्यविन्यास इतना आसान है और मैं आलसी हूं। –

+0

मैंने सूत्रों को थोड़ा सा साफ कर दिया है; https://github.com/raistlinthewiz/concurrency-tests – HuseyinUslu

+1

परीक्षण करने के लिए सभी कार्यों के माध्यम से जाने के लिए धन्यवाद। – GregoryBrad

0

मुझे अपने आईओ-बाध्य मामले के लिए अनुक्रमिक दृष्टिकोण के समान परिणाम देने वाले टीपीएल का डर है।

मुझे लगता है कि यह होगा। बाधा क्या है? पार्सिंग या डाउनलोड कर रहा है? मल्टीथ्रेडिंग आपको वेब से डाउनलोड करने में बहुत मदद नहीं करेगा।

मैं फसल के लिए कार्य समानांतर लाइब्रेरी का उपयोग करता हूं, डाउनलोड छवियों के लिए मुखौटा या प्रभाव लागू करता हूं, पॉडकास्ट आदि से कुछ नमूना काटता हूं। यह अधिक स्केलेबल है।

लेकिन यह परिमाण की गति का क्रम नहीं होगा। परीक्षण, कुछ सुविधाओं को लागू करने के लिए अपने संसाधन खर्च करें।

पीएस। "वाह मेरा कार्य 0.9 के बजाय 0.7 एस में निष्पादित करता है";

+0

बोटलनेक सामग्री डाउनलोड कर रहा है। एक नियमित उपयोगकर्ता 10+ फ़ीड्स की सदस्यता लेता है और मेरे परीक्षणों से, इसमें कम से कम 15+ सेकेंड लगते हैं - कम से कम मेरे टेस्ट सबसेट के लिए - अनुक्रमिक दृष्टिकोण के साथ उन सभी को डाउनलोड और पार्स करने के लिए। मुझे लगता है कि सुधार के लिए पर्याप्त जगह है। – HuseyinUslu

+0

मैंने पोस्ट किए गए परीक्षण परिणामों के आधार पर, ऐसा लगता है कि यह सच था कि सुधार के लिए पर्याप्त जगह थी। – HuseyinUslu

1

आप अपने स्वयं के task scheduler को एक टीपीएल कार्य में असाइन कर सकते हैं। डिफ़ॉल्ट work stealing हालांकि एक काफी चालाक है।

+0

मैंने उस संसाधन को पढ़ लिया है और वास्तव में मैं इसके कारण चिंतित हूं; .NET Framework 4 में, डिफ़ॉल्ट कार्य शेड्यूलर को थ्रेड पूल के साथ कड़ाई से एकीकृत किया जाता है। यदि आप डिफ़ॉल्ट कार्य शेड्यूलर का उपयोग करते हैं, तो समानांतर कार्यों को निष्पादित करने वाले कार्यकर्ता थ्रेड .NET ThreadPool क्लास द्वारा प्रबंधित किए जाते हैं। ** आम तौर पर, कम से कम कई कार्यकर्ता धागे आपके कंप्यूटर पर कोर ** के रूप में होते हैं। - अगर मैं एक एकल कोर वातावरण पर चल रहा हूं तो क्या होगा? मुझे इस पर कोई स्पष्टीकरण नहीं मिल रहा है .. – HuseyinUslu

+1

तो आप समांतरता की _minimum_ डिग्री को लागू करना चाहते हैं, उदा। पिछले X डिग्री पर, इस मामले में? 'टास्क क्रिएशनऑप्शन। लोंगरिंगिंग' [शायद] (http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/8304b44f-0480-488c-93a4-ec419327183b/) जो भी आप चाहते हैं। कस्टम शेड्यूलर एक और विकल्प है यदि आप डिफ़ॉल्ट रूप से जो कुछ भी चाहते हैं उसे करने के लिए मना नहीं सकते हैं। – ehnmark

+0

असल में यह मेरे द्वारा पोस्ट किए गए परीक्षण परिणामों के आधार पर लगता है, मेरी चिंताओं को मान्य नहीं था। – HuseyinUslu

2

आप सही हैं कि जब आप अपना खुद का थ्रेड पूल बनाते हैं तो टीपीएल आपके कुछ नियंत्रण को हटा देता है। लेकिन यह केवल तभी सही है जब आप गहरी खुदाई नहीं करना चाहते हैं। टीपीएल आपको लंबे समय तक चलने वाले कार्यों को बनाने की अनुमति देता है जो टीपीएल थ्रेड पूल का हिस्सा नहीं हैं और आपके उद्देश्य को अच्छी तरह से पूरा कर सकते हैं।प्रकाशित पुस्तक जो एक मुफ्त पढ़ी Parallel Programming with Microsoft .NET है, आपको अधिक अंतर्दृष्टि प्रदान करेगी कि टीपीएल का उपयोग कैसे किया जाना है। आपके पास हमेशा पैराले देने का विकल्प होता है। के लिए, कार्य explicit पैरामीटर कितने थ्रेड आवंटित किए जाने चाहिए। इसके अलावा यदि आप पूर्ण नियंत्रण चाहते हैं तो आप टीपीएल शेड्यूलर को अपने आप से बदल सकते हैं।

15

आप आईओ बाध्य कार्यों के लिए प्रवाह क्षमता को अधिकतम करने के आप पूरी तरह चाहिए पारंपरिक अपने TPL आधारित काम के साथ अतुल्यकालिक प्रसंस्करण मॉडल (एपीएम) एपीआई गठबंधन प्रयास कर रहे हैं। एएसएम एपीआई सीपीयू थ्रेड को अनब्लॉक करने का एकमात्र तरीका है जबकि एसिंक्रोनस आईओ कॉलबैक लंबित है। एपीएम और टीपीएल कोड के संयोजन में सहायता के लिए टीपीएल the TaskFactory::FromAsync helper method प्रदान करता है।

एएसआईएनसी निर्वाण प्राप्त करने के लिए इन दो प्रोग्रामिंग मॉडल को गठबंधन करने के तरीके के बारे में अधिक जानकारी के लिए एमएसडीएन पर .NET SDK के इस अनुभाग को TPL and Traditional .NET Asynchronous Programming पर देखें।

0

यदि आप यूआरएल पर अपनी कॉल समानांतर करते हैं, तो मुझे लगता है कि यह आपके आवेदन में सुधार करेगा, भले ही केवल एक कोर हो। इस कोड पर एक नज़र डालें:

var client = new HttpClient(); 
var urls = new[]{"a", "url", "to", "find"}; 

// due to the EAP pattern, this will run in parallel. 
var tasks = urls.Select(c=> client.GetAsync(c)); 

var result = Tasks.WhenAll(task).ContinueWith(a=> AnalyzeThisWords(a.Result)); 
result.Wait(); // don't know if this is needed or it's correct to call wait 

इस मामले में multithreading और asynchrony के बीच का अंतर कैसे कॉलबैक/पूरा किया जाता है।

ईएपी का उपयोग करते समय कार्यों की संख्या धागे की संख्या से संबंधित नहीं है।

जैसा कि आप GetAsync कार्य पर भरोसा कर रहे हैं, http क्लाइंट नेटवर्कस्ट्रीम (सॉकेट, टीसीपी क्लाइंट या जो कुछ भी) का उपयोग करता है और BeginRead/EndRead पूरा होने पर एक ईवेंट को बढ़ाने के लिए इसे सिग्नल करता है। तो, इस पल में कोई धागा शामिल नहीं है।

पूरा होने के बाद, शायद एक नया धागा बनाया गया है, लेकिन यह एक नया धागा बनाने के लिए टास्कशेड्यूलर (कॉल GetAsync/ContinueWith कॉल कॉल में उपयोग किया जाता है) पर मौजूद है, मौजूदा थ्रेड का उपयोग करें या कॉलिंग थ्रेड का उपयोग करने के लिए कार्य को इनलाइन करें ।

यदि AnalyzeThisWords बहुत अधिक समय के लिए ब्लॉक करता है, तो आप थ्रेड पूल वर्कर से जारी किए गए जारीवृद्धि पर "कॉलबैक" के रूप में बाधाएं प्राप्त करना शुरू कर देते हैं।

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