2010-08-03 7 views
11

मैं वर्तमान में एक समस्या से निपट रहा हूं जहां मुझे मौजूदा फ़ंक्शन को अवरुद्ध करने से रोकने के लिए नरक को अन्य थ्रेड में बहुत से फ़ंक्शन भेजना पड़ता है। अब मुझे आश्चर्य है कि इस कार्य को करने का सबसे तेज़ तरीका क्या है।एक विधि को अतुल्यकालिक रूप से निष्पादित करने का सबसे तेज़ तरीका?

वर्तमान में

ThreadPool.UnsafeQueueUserWorkItem 
के रूप में नियमित रूप से QueueUserWorkItem की तुलना में अपने थोड़ा तेज

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

+4

जब आप कहते हैं कि 'तेजी' तुम्हारा मतलब है कि आप 'मुख्य' धागे पर अवरुद्ध को कम करना चाहते हैं? विशेष रूप से, वह कॉल जो पृष्ठभूमि प्रसंस्करण के लिए आइटम को कतार देता है जितनी जल्दी हो सके लौटता है? –

+0

आपकी उल्लिखित चिंता डब्लूआरटी, थ्रेडपूल उस कॉल (या सामान्य 'सुरक्षित' एक) के लिए अवरुद्ध नहीं होता है, लेकिन यह सफलतापूर्वक कतारबद्ध होने के लिए एक बूल लौटाता है, सिद्धांत यह है कि यदि यह झूठा हो जाता है, तो हो सकता है कि आप वर्तमान धागे पर इसे निष्पादित करना चाहते हैं, या फिर बाद में कोशिश करें, या जो भी हो। –

+0

क्या आप हर बार एक ही विधि को प्रेषित कर रहे हैं? क्या उन्हें एक-दूसरे से एसिंक संचालित करने की ज़रूरत है? क्या निर्माता/उपभोक्ता दृष्टिकोण स्वीकार्य है? (इसलिए कॉलर बस कतार में कुछ जोड़ता है)। .NET का कौन सा संस्करण इस पर है? –

उत्तर

2

CLR (4) टीम की सिफारिश की:

टास्क अब थ्रेड पूल के लिए काम क़तार में पसंदीदा तरीका है।

CLR 4.0 ThreadPool Improvements: Part 1 और New and Improved CLR 4 Thread Pool Engine विस्तृत जानकारी के लिए पढ़ें। संक्षेप में, कारण हैं: स्थानीय कतार, धागे का पुन: उपयोग, चोरी करना। लोड संतुलन लक्ष्य के लिए मूल रूप से।

अतिरिक्त सुविधाएं:

मुझे समझ नहीं आता क्यों यह जवाब (downvoted) नहीं है है।

आप

मैं नरक के लिए एक और धागा करने के लिए कार्यों का एक बहुत प्रेषण करने के लिए है अवरुद्ध "

से वर्तमान समारोह को रोकने के लिए लिखा था मैं उत्तर: कुछ TPL (net35 के लिए मौजूद है) 'ब्लॉक' (समवर्ती संग्रह, कताई प्राइमेटिव इत्यादि) विशेष रूप से अत्यधिक समवर्ती पहुंच के लिए डिज़ाइन किए गए हैं, प्रभावशाली के लिए अवरुद्ध करने या समाप्त करने पर ध्यान केंद्रित करें काम के Ient प्रबंधन। आप उन ब्लॉकों का भी उपयोग कर सकते हैं (पूर्व में - आपकी समस्या के लिए ब्लॉकिंग कोलेक्शन)। टीपीएल कम से कम ओवरहेड (या PLinq की मदद से लाखों) के साथ सैकड़ों (या यहां तक ​​कि हजारों) सीपीयू/आईओ-बाध्य संचालन (कार्यों) को बनाने और संभालने के लिए डिज़ाइन किया गया है।

आप से पूछा:

मैं सिर्फ आश्चर्य है कि क्या सबसे अच्छा अभ्यास इस तरह के एक कार्य के लिए है?

मैं पहले से ही उत्तर दिया है: सबसे अच्छा अभ्यास - TPL (तर्क ही नहीं, मेरी सिफारिश)

+0

+ अतिरिक्त। अगर डाउनवॉटिंग हो तो कृपया टिप्पणी जोड़ें – SalientBrain

1

एक साथ कई या बड़ी वस्तुओं को सम्मिलित करना ओवरहेड को कम करना चाहिए।

अपनी टिप्पणी में से एक को पढ़ने के बाद संपादित:

मैं इसी तरह की बातों का अनुभव किया है। मेरा सामान्य उपाय तुरंत हर एसिंक्रोनस अनुरोध को प्रेषित नहीं करना है बल्कि टीसीपी के लिए Nagle's Algorithm की नकल करना है।

यहां, अनुरोध प्राप्त करने पर() यदि आप कोई असीमित कार्य लंबित नहीं हैं तो आप तुरंत इसे प्रेषित करेंगे। यदि एसिंक्रोनस काम लंबित है तो आप केवल तभी प्रेषित होंगे जब सबसे पहले गैर-प्रेषित अनुरोध समाप्त होने के बाद मिलीसेकंड की एक निश्चित संख्या समाप्त हो गई हो या बकाया अनुरोध() एस की एक निश्चित संख्या जमा हो गई हो।

यह लगातार अनुरोध() एस प्राप्त करने पर ओवरहेड को काटने का एक प्रभावी पैटर्न है जिस पर आपका कोई नियंत्रण नहीं है। उम्मीद है की वो मदद करदे।

+0

ओपी के आधार पर यह काम नहीं करेगा कि इरादा बहुत तेजी से प्रेषण करना है। उपभोक्ताओं का निष्पादन निर्माता से कोई फर्क नहीं पड़ता। ऐसे मामले में एक नागल के प्रकार का बफरिंग सहायक नहीं हो सकता है? – Gangadhar

+0

"बहुत तेजी से प्रेषण" संदिग्ध है। एक नाग एल्गोरिदम उचित रूप से कम प्रेषण विलंबता और बहुत अच्छा यद्यपि सुनिश्चित करता है। यही वह है जिसे मैं तेज़ प्रेषण कहता हूं हालांकि चलो ओपी सुनते हैं। –

0

शायद आप अपने सभी प्रेषण अनुरोधों को सूची <> में डाल सकते हैं और क्यूईयूसर वर्कइटम पर कॉल करने के लिए एक और पृष्ठभूमि थ्रेड जगा सकते हैं।

क्या मैं समस्या को सही ढंग से समझ रहा हूं?

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