पिछली 2 पोस्टों में, हमने फैनआउट और फैनिन को अलग से देखा है। अक्सर ऐसा होता है कि हम उनका एक साथ उपयोग करते हैं जहां हमारे पास एक एकल डेटा स्ट्रीम होती है जहां हम व्यक्तिगत रूप से वस्तुओं पर काम करना चाहते हैं और समवर्तीता का उपयोग करके सुरक्षित रूप से ऐसा कर सकते हैं। इसलिए, हम कई वर्कर थ्रेड्स में फ़ैनआउट करते हैं और फिर एक ही स्ट्रीम में फ़ैनइन करते हैं।
उदाहरण के लिए, मान लें कि आपके पास एक बड़ी लॉग फ़ाइल है। आप फ़ाइल को टुकड़ों में तोड़ सकते हैं, जिससे प्रत्येक कार्यकर्ता को फ़ाइल के एक अलग हिस्से पर एक साथ काम करने की अनुमति मिल सकती है, फिर परिणामों को संयोजित किया जा सकता है।
यदि आपने पिछली दो पोस्ट का अनुसरण किया है, तो यह पैटर्न स्पष्ट है। यदि आप निश्चित नहीं हैं तो ऊपर दिए गए लिंक देखें।
// produce is simulating our single input as a channel func produce() chan int { ch := make(chan int) go func() { for i := 0; iएक प्रोड्यूस() फ़ंक्शन है जो संख्याओं की एक सिम्युलेटेड इनपुट स्ट्रीम बनाता है।
एक वर्कर फ़ंक्शन है जो इनपुट चैनल पर तब तक काम करता है जब तक कोई और डेटा न हो। प्रत्येक मान पर यह इनपुट डेटा को 'प्रोसेस' करता है (यह निर्धारित करता है कि मान विषम है या सम), फिर आउटपुट चैनल पर परिणाम संरचना भेजता है।
ध्यान दें कि जब प्रत्येक कार्यकर्ता का काम पूरा हो जाता है, तो वह अपना परिणाम चैनल बंद कर देता है। गतिरोध को रोकने के लिए यह आवश्यक है क्योंकि फैनिन ऑपरेशन अन्यथा चान पर अधिक डेटा की प्रतीक्षा में सो जाएगा।
मुख्य थ्रेड उत्पादन से इनपुट स्ट्रीम प्राप्त करता है, फिर कई श्रमिकों को लॉन्च करता है और प्रत्येक कार्यकर्ता को अपना चैनल देता है जहां वह अपने परिणाम भेजेगा।
ये परिणाम चैनल फिर फैनिन ऑपरेशन में भेजे जाते हैं। फ़ैनिन के लिए, हम आउटपुट प्राप्त करने के लिए एक चैनल बनाते हैं, फिर प्रत्येक कार्यकर्ता चैनल के लिए एक गोरोइन लॉन्च करते हैं। प्रत्येक गोरोइन केवल चैनल पर तब तक दोहराता रहता है जब तक कि कोई और डेटा न रह जाए और फिर समाप्त हो जाता है। याद रखें कि हमने वर्कर थ्रेड में परिणाम चैनल बंद कर दिया है, यही वह है जो लूप को समाप्त करने की अनुमति देता है
ध्यान दें कि हम फ़ैनिन प्रक्रिया के लिए वेटग्रुप का उपयोग करते हैं। इससे हमें तब पता चलता है जब सभी परिणाम चैनलों के सभी परिणाम आउटपुट चैनल में संयोजित हो जाते हैं। जब ऐसा होता है, तो हम आउटपुट चैनल बंद कर देते हैं ताकि आउटपुट का उपभोग करने वाला कोई भी डाउनस्ट्रीम थ्रेड समाप्त हो सके।
आउटपुट चैनल में सभी डेटा के साथ, मुख्य थ्रेड आगे बढ़ सकता है और परिणाम प्रदर्शित कर सकता है। ध्यान दें कि जब तक सब कुछ पूरा नहीं हो जाता तब तक मुख्य थ्रेड को समाप्त होने से रोकने के लिए हम एक बूलियन चैनल का उपयोग करते हैं; अन्यथा, यह प्रक्रिया समाप्त कर देगा।
ध्यान दें कि सेलेक्ट स्टेटमेंट का उपयोग करके फैन-इन करने का एक और तरीका है। यहां इस्तेमाल की गई तकनीक थोड़ी साफ-सुथरी है क्योंकि हम श्रमिकों की संख्या बढ़ा या घटा सकते हैं।
यह भी ध्यान दें कि हमने SIGTERM या SIGINT जैसी चीजों से जल्दी समाप्ति के संबंध में कुछ भी संबोधित नहीं किया है। इससे थोड़ी अधिक जटिलता जुड़ जाती है।
आप इसे कैसे लागू करेंगे? फैनआउट/फैनिन पैटर्न के अन्य कार्यान्वयन भी हैं। कृपया अपनी टिप्पणियाँ और विचार नीचे छोड़ें?
धन्यवाद!
इस पोस्ट और इस श्रृंखला के सभी पोस्ट का कोड यहां पाया जा सकता है
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3