2015-11-05 18 views
8

मैं एक वेबएपी विधि बनाने की कोशिश कर रहा हूं जो लूप गणनाओं की एक श्रृंखला चलाता है जिसे आगे अनुकूलित करना मुश्किल होगा।सिंगल एएसपीनेट अनुरोध के लिए एकाधिक कोर

x.Items.AsParallel().ForAll(item => 
{ 
    item.RunCalcs(); 
}); 

जब यह कोड निष्पादित करता है, सर्वर कार्य प्रबंधक को देखकर ऐसा लगता है कि यह केवल एक एकल प्रोसेसर कोर बाहर maxes, जबकि अन्य कोर अछूते ही रहे।

जो मैंने पढ़ा है, एएसपीनेट एक प्रोसेसर कोर के लिए एक ही अनुरोध को सीमित करता है। चूंकि यह बहुत कम अनुरोध के साथ एक इंट्रानेट सर्वर है, इसलिए मैं सर्वर संसाधनों के प्रबंधन से चिंतित नहीं हूं।

क्या मेरे लूप को तेजी से चलाने के लिए इस व्यवहार के आसपास ओवरराइड या काम करने का कोई तरीका है?

+2

आप MaxDegreeOfParallelism स्थापित करने के लिए करने की कोशिश की विकल्प? समानांतर।ForEach (आइटम, नया समांतर विकल्प() {MaxDegreeOfParallelism = Environment.ProcessorCount}, item => {...}); –

+0

वैसे भी आप अपने लूप को डिज़ाइन कर सकते हैं और लोड को फैलाने के लिए अलग-अलग थ्रेड शुरू कर सकते हैं। तो यदि आपके पास 1000 वस्तुओं का संग्रह पहले 500 के लिए थ्रेड को आग लगाता है और शेष 500 के लिए एक और धागा है? – WooHoo

+0

@ एसके जो इस मुद्दे को हल करने लगता है, लेकिन मुझे यकीन नहीं है कि क्यों मैंने सोचा था कि PLinq ForAll को अधिकतम उपलब्ध संसाधनों का उपयोग करना था। शायद यह एएसपीनेट के तहत अलग है। – phosplait

उत्तर

1

एएसपी.Net टीपीएल के लिए भी बहुत साफ तरीके से उपयोग किए गए धागे की संख्या को सीमित कर सकता है। बस एक कार्य शेड्यूलर बनाकर, जो एक थ्रेड तक सीमित है और दिए गए टास्कशेड्यूलर पर एएसपी.Net अनुरोध शुरू कर रहा है। मैं शर्त लगाता हूं, उनके पास इन सीमित कार्यस्कूलर का पूल होगा, यह समझ में आता है ...

फिर जब आप टीपीएल या पीआईएलक्यू को कॉल करते हैं तो कार्य प्रसंस्करण एएसपी.Net अनुरोध के अंदर क्या होगा?

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

लेकिन, लेकिन, बट :)TaskScheduler.Current के शीर्ष पर, इन का समय निर्धारण कर रहे हैं कार्यों और है कि हमारे सीमित TaskScheduler हम पहले से ही पर चल रहे हैं है! इसलिए सभी निर्धारित कार्यों को सीमित टास्कशेल्डर पर जला दिया जाएगा चाहे आपकी मशीन कितनी कोर हो।

दूसरी ओर, ऐसा लगता है कि async/await ऑपरेशंस नए कार्य का उपयोग कर रहे हैं। Run() .NET 4.5+ में पेश किया गया था और यह सुझाव दिया गया था कि यह TashScheduler पर कार्य शेड्यूल कर रहा है। डीफॉल्ट, थ्रेडपूल स्वयं क्या है , तो कोर की संख्या के अलावा, वहां कोई सीमा नहीं है। मेरे पास इस लीड के अलावा सबूत नहीं है: Regarding usage of Task.Start() , Task.Run() and Task.Factory.StartNew() TPL

दुर्भाग्यवश AsParallel() में टास्कशेड्यूलर लेने वाला कोई अधिभार नहीं है।

तो समाधान होगा:

  1. पहले एक पहले से ही @S कश्मीर ने सुझाव दिया, वर्ग समानांतर का उपयोग करें और समानांतरवाद की डिग्री निर्दिष्ट करने के लिए। कक्षा PLINQ की भविष्यवाणी करती है और यह थ्रेडपूल का उपयोग कर रही है क्योंकि यह उपयुक्त लगता है।
  2. दूसरा विचार थ्रेडपूल पर स्वयं निर्धारित करना होगा।
  3. या TaskScheduler.Default पर शेड्यूल कार्य, थ्रेडपूल को लक्षित करना।
  4. या एएसपी.Net के लिए अपने धागे (सबसे बुरा विचार) स्पॉन करें।
  5. या टास्कशेड्यूलर पर काम चलाने के लिए async/प्रतीक्षा करें। डीफॉल्ट, थ्रेडपूल और एसिंक विधि में AsParalel() का उपयोग करें, क्योंकि वहाँ TaskScheduler.Current TaskScheduler.Default, बस ThreadPool के समान होगा। चेतावनी के

नोट: कृपया ध्यान दें, कि ASP.Net में ThreadPool पर भारी सामान का समय निर्धारण प्रसंस्करण ASP.Net अनुरोधों के घटते प्रदर्शन करने के लिए नेतृत्व कर सकते हैं ...

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