2010-09-14 22 views
5

वर्तमान में मैं डेटा के लिए विभिन्न प्रदाताओं के लिए के बारे में 7 वेब सेवा कॉल करने के लिए की जरूरत है कि कोड का एक खंड होता है। प्रत्येक कॉल को निष्पादित करने में कई सेकंड लगते हैं, इसलिए मैं उन्हें चीजों को गति के समानांतर में चलाने के लिए चाहता हूं।एकाधिक असीमित कॉल के लिए .NET समानांतर एक्सटेंशन (समानांतर। इन्वोक) का उपयोग करना?

मैंने अपनी 7 कॉल समानांतर में लपेट ली है। इन्वोक जो एक ही समय में दो चीजों को चलाने में बहुत अच्छा काम करता है, लेकिन 2 कोर सर्वर पर, यह केवल एक समय में एक कोर को निष्पादित करेगा। चूंकि मैं बस इतना कर रहा हूं कि वेब सेवा कॉल वापस लौटने के लिए मैं इंतजार कर रहा हूं, मैं चाहता हूं कि यह सभी 7 लाने के लिए और वापस आने के लिए प्रतीक्षा करें।

वहाँ यह करने के लिए कोई रास्ता नहीं है? या शायद मेरा दृष्टिकोण गलत है? शायद मुझे वेब सेवाओं में एसिंक्रोनस कॉल बनाने की ज़रूरत है? लेकिन फिर आगे बढ़ने से पहले उन सभी के लिए वापस आने का इंतजार कैसे करें?

उत्तर

5

लेकिन एक 2 कोर सर्वर पर, यह केवल 2 एक समय में कोर प्रति एक निष्पादित करेंगे,

मैं इस सवाल होगा - Parallel.Invoke आम तौर पर आपके सिस्टम में कोर की तुलना में बहुत अधिक कार्य चलेगा ।

इसका अर्थ है कि आप अतुल्यकालिक विधि कॉल आमंत्रण उपयोग कर रहे हैं, मैं अपने सात अलग कार्यों उत्पन्न करने के लिए Task.Factory.FromAsync(...) का उपयोग कर की सिफारिश करेंगे।

यह कार्य निष्पादित करते समय अन्य काम करने की लचीलापन प्रदान करता है, फिर परिणाम का उपयोग करने का निर्णय लेने पर Task.WaitAll (या Task.WaitAny) को कॉल करना।

Parallel.Invoke, दूसरे हाथ पर, हमेशा जब तक सभी सात पूरा रोकेंगे।

+2

मुझे यह धारणा मिली कि वह चाहते थे कि वे सभी जारी रखने से पहले पूरा करें। –

+1

@ स्टेवेन: वह कार्य के माध्यम से कौन कर सकता है। वैटएल - लेकिन वह इंतजार करते समय अन्य काम कर सकता है, अगर यह उपलब्ध है, तो यह एक विकल्प है। इस तरह के मामले, हालांकि, अक्सर कार्य के साथ काम करते हैं। वैटएनी, क्योंकि आप आमतौर पर कुछ कार्यों को पूरा कर सकते हैं जैसे ही कुछ कार्य पूरा हो जाते हैं - यह दुर्लभ है कि आपको किसी भी प्रोसेसिंग के लिए 7 अलग-अलग परिणामों की आवश्यकता है ... –

+0

आप ठीक है, यह मैंने जो भी सुझाव दिया उससे भी अधिक काम करेगा। –

0

आप संगामिति स्तर को बढ़ाने के ParallelOptions निर्दिष्ट कर सकते हैं। डिफ़ॉल्ट CPU-बाध्य कार्यों के लिए उचित है, लेकिन आप I/O-bound वाले से निपट रहे हैं, इसलिए यह उस व्यवहार को ओवरराइड करने के लिए समझ में आता है।

+0

मैंने सोचा कि समेकन स्तर में वृद्धि केवल अधिकतम सहमति के अनुसार ही जाती है? यानी यदि आपके पास 8 कोर हैं, तो आप समेकन स्तर को किसी भी चीज़ पर सेट कर सकते हैं..लेकिन 8 से अधिक जा रहे कुछ भी नहीं करेंगे ... – puffpio

+0

@puffpio: यह सब कहता है: "MaxDegreeOfParallelism समानांतर विधि कॉल द्वारा चलाए गए समवर्ती संचालन की संख्या को सीमित करता है जो इस समांतर विकल्प उदाहरण को सेट मान पर पारित कर दिया जाता है, यदि यह सकारात्मक है। यदि MaxDegreeOfParallelism -1 है, तो कोई सीमा नहीं है समवर्ती चल रहे संचालन की संख्या पर रखा गया। " –

+0

हाँ जो मुझे भ्रमित करता है, क्योंकि यह कहता है कि "सीमा" जो मेरे लिए है इसका मतलब है कि यह आपके पास कोर की संख्या से आगे नहीं जायेगा। मैं कहता हूं कि पैरालेल.इनवोक पर पृष्ठ कहता है: "ध्यान दें कि Invoke() के साथ, आप बस व्यक्त करते हैं कि आप किन कार्रवाइयों को एक साथ चलाना चाहते हैं, और रनटाइम सभी थ्रेड शेड्यूलिंग विवरणों को संभालता है, जिसमें स्वचालित रूप से कोर की संख्या में स्केलिंग शामिल है होस्ट कंप्यूटर।" – puffpio

1

इस के लिए Parallel.Invoke उपयोग करने के लिए कोई वास्तविक आवश्यकता नहीं है। आप आगे बढ़ सकते हैं और एकाधिक एसिंक्रोनस अनुरोध जारी कर सकते हैं (यानी HttpWebRequest.BeginGetResponse())। जब वे सभी पूरा हो जाए तो अधिसूचित होने के लिए, आपके पास कई विकल्प हैं। पहला अनुरोध जारी करने से पहले CountdownEvent को प्रारंभ करने का एक आसान तरीका होगा, और उसके बाद अनुरोध जारी किए जाने के बाद उस ईवेंट पर मुख्य थ्रेड प्रतीक्षा करें। एसिंक्रोनस कॉलबैक विधियों प्रत्येक घटना को पूरा करते हैं जैसे वे पूरा करते हैं। इस तरह, आप सुनिश्चित करते हैं कि आपके मुख्य थ्रेड जारी होने से पहले सभी अनुरोध पूर्ण हो गए हैं।

+1

लेकिन टीपीएल एपीएम की तुलना में बहुत अधिक _easier_ है। यह अच्छा होगा अगर हम दोनों दुनिया के सर्वश्रेष्ठ हो सकते हैं। –

+0

कार्य का उपयोग करना। फैक्टरी.स्टार्टएसिंक दोनों दुनिया के सर्वश्रेष्ठ प्रदान करता है ... उलटी गिनती इत्यादि के साथ ट्रैक करने की आवश्यकता के बिना –

+0

मुझे टीपीएल पर अधिक बारीकी से देखने की आवश्यकता है। –

0

मैं a response that I made to another question क्रियापद प्रतिलिपि बनाने जा रहा हूं क्योंकि यह समान रूप से, यदि अधिक नहीं है, तो यहां लागू है।


आप बस अतुल्यकालिक प्रोग्रामिंग मॉडल (एपीएम) को हरा नहीं सकता है जब वह आई/ओ प्रदर्शन की बात आती है। जब भी आप इसका इस्तेमाल कर सकते हैं, आपको होना चाहिए। सौभाग्य से टास्क समांतर लाइब्रेरी (टीपीएल) the FromAsync factory method के माध्यम से "शुद्ध" टीपीएल कार्यों के मिश्रण में एपीएम काम के संयोजन के लिए समर्थन में बेक्ड के साथ आता है।

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

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