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