2013-05-30 7 views
26

स्कैला में वायदा का उपयोग करते समय डिफ़ॉल्ट व्यवहार डिफ़ॉल्ट Implicits.global निष्पादन संदर्भ का उपयोग करना है। यह प्रति प्रोसेसर उपलब्ध एक थ्रेड बनाने के लिए यह डिफ़ॉल्ट लगता है। एक अधिक पारंपरिक थ्रेडेड वेब एप्लिकेशन में यह एक खराब डिफ़ॉल्ट की तरह लगता है जब वायदा एक कार्य कर रहे हैं जैसे किसी डेटाबेस पर प्रतीक्षा करना (कुछ सीपीयू बाध्य कार्य के विपरीत)।क्या मुझे डिफ़ॉल्ट निष्पादन कॉन्टेक्स्ट को ओवरराइड करना चाहिए?

मुझे उम्मीद है कि डिफ़ॉल्ट संदर्भ को ओवरराइड करना उत्पादन में काफी मानक होगा, लेकिन मुझे ऐसा करने के बारे में बहुत कम दस्तावेज मिल सकता है, ऐसा लगता है कि यह सामान्य नहीं हो सकता है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

39

डिफ़ॉल्ट निष्पादन संदर्भ को ओवरराइड करने के बारे में सोचने के बजाय, क्यों न पूछें "क्या मुझे विभिन्न चीज़ों के लिए एकाधिक निष्पादन संदर्भों का उपयोग करना चाहिए?" यदि यह सवाल है, तो मेरा जवाब हाँ होगा। जहां मैं काम करता हूं, हम अक्का का उपयोग करते हैं। हमारे ऐप के भीतर, हम गैर ब्लॉकिंग कार्यक्षमता के लिए डिफ़ॉल्ट अक्का निष्पादन संदर्भ का उपयोग करते हैं। फिर, क्योंकि वर्तमान में कोई अच्छा गैर अवरुद्ध jdbc ड्राइवर नहीं है, हमारे सभी अवरुद्ध SQL कॉल एक अलग निष्पादन संदर्भ का उपयोग करते हैं, जहां हमारे पास प्रति कनेक्शन दृष्टिकोण धागा है। मुख्य निष्पादन संदर्भ (एक कांटा में शामिल पूल) को अवरुद्ध करने से मुक्त करने के लिए हमारे लिए थ्रूपुट में महत्वपूर्ण वृद्धि को ध्यान में रखते हुए।

मुझे लगता है कि आपके सिस्टम के भीतर विभिन्न प्रकार के कार्यों के लिए कई अलग-अलग निष्पादन संदर्भों का उपयोग करना बिल्कुल ठीक है। यह हमारे लिए अच्छा काम करता है।

+3

+1 यह उल्लेख करने के लिए कि महत्वपूर्ण निर्णय कारक यह है कि आप वायदा में अवरुद्ध (या लंबे समय तक चलने वाले) कोड का उपयोग करते हैं या नहीं। यदि आप नहीं करते हैं, अलग निष्पादन संदर्भों का उपयोग वास्तव में उत्पादक काउंटर है। –

+0

यदि आप एक कस्टम एक्जिक्यूटर चाहते हैं तो आप नियंत्रण कर सकते हैं लेकिन डिफ़ॉल्ट समांतरता और अन्य पैरामीटर के साथ चिपकना चाहते हैं, ऐसा लगता है कि 'निष्पादनकॉन्टेक्स्ट.फॉमएक्सएटर (नया scala.concurrent.forkjoin.ForkJoinPool) '(पैरामीटर के बिना) चाल चल रहा है ; 8 कोर (सहित हाइपरथ्रेडिंग) के साथ मेरे i7 पर 8 का पूल बनाता है, जो 'फोर्कजोइनपूल' से मेल खाता है।CommonPool' शामिल है। –

+0

@cmbaxter क्या आप अपने जेडीबीसी कॉल को वायदा के अंदर 'अवरुद्ध {}' में लपेटते हैं? यदि एक अलग निष्पादन कॉन्टेक्स्ट है तो क्या यह आवश्यक है? –

2

हां, आपके आवेदन में अन्य निष्पादन संदर्भों का निर्माण और उपयोग करना निश्चित रूप से एक अच्छा विचार है।

निष्पादन संदर्भ आपके समवर्ती मॉडल को मॉड्यूलरेट करेंगे और आपके एप्लिकेशन के विभिन्न हिस्सों को अलग करेंगे, ताकि यदि आपके ऐप के किसी हिस्से में कुछ गलत हो जाए, तो अन्य हिस्सों से इससे कम प्रभावित होगा। अपने उदाहरण पर विचार करने के लिए, आपके पास डीबी-विशिष्ट संचालन के लिए एक अलग निष्पादन संदर्भ होगा और दूसरा अनुरोध, वेब अनुरोधों की प्रसंस्करण के लिए होगा।

this presentation जोनास बोनर द्वारा इस पैटर्न को अधिक स्थिरता & गलती सहनशीलता के लिए आपके आवेदन में "बल्कहेड" बनाने के रूप में जाना जाता है।

मुझे स्वीकार करना होगा कि मैंने निष्पादन संदर्भ उपयोग के बारे में बहुत कुछ नहीं सुना है। हालांकि, मैं इस सिद्धांत को कुछ ढांचे में लागू करता हूं। उदाहरण के लिए, खेलने के नौकरियों के विभिन्न प्रकार के लिए अलग निष्पादन संदर्भों का उपयोग करेगा और वे अलग अलग पूल में अपने कार्यों को विभाजित करने के लिए प्रोत्साहित करते हैं यदि आवश्यक हो: Play Thread Pools

अक्का मिडलवेयर भी अलग संगामिति क्षेत्रों के लिए विभिन्न संदर्भों में अपने एप्लिकेशन बंटवारे का सुझाव आपका आवेदन। वे Dispatcher की अवधारणा का उपयोग करते हैं जो बैटरी पर निष्पादन संदर्भ है।

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

+1

स्कैला में डिफ़ॉल्ट 'निष्पादन कॉन्टेक्स्ट' सबसे हाल ही में फोर्कजोइन पूल है। यह देखते हुए कि, आपका बयान है कि वैश्विक निष्पादन संदर्भ "छोटी, त्वरित नौकरियों के लिए है, लेकिन यह निश्चित रूप से एक बड़े आवेदन के लिए पैमाने पर नहीं होगा" निष्कासित है। –

+0

ऐसा नहीं है कि डिफ़ॉल्ट निष्पादन संदर्भ स्वयं में प्रदर्शन नहीं कर रहा है। मेरा कहना था कि बड़े पैमाने पर आवेदन में केवल एक निष्पादन संदर्भ का उपयोग करना सबसे अच्छी बात नहीं है। फिर भी, मैंने उस टिप्पणी को हटा दिया क्योंकि यह भ्रमित था। –

3

"सही" उत्तर यह है कि आपके विधियों को निष्पादन कॉन्टेक्स्ट का उपयोग करने की आवश्यकता होती है, उनके हस्ताक्षर में निष्पादन कॉन्टेक्स्ट की आवश्यकता होती है, ताकि आप उच्च स्तर पर निष्पादन को नियंत्रित करने के लिए "बाहरी" से निष्पादन कॉन्टेक्स्ट (ओं) की आपूर्ति कर सकें।

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

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