Channels के साथ Go Concurrency में महारत हासिल करें
मैंने एक बार Go में एक इमेज प्रोसेसिंग पाइपलाइन बनाई थी।
मैंने हर स्टेप के लिए goroutines का इस्तेमाल किया। मैंने उन्हें channels के साथ लिंक किया। मैंने रन (run) किया।
प्रोग्राम फ्रीज हो गया। मेमोरी का उपयोग बढ़ता गया। फिर वह बंद हो गया। कोई एरर नहीं आया। बस सन्नाटा था।
मैंने एक खराब शेड्यूलर को डीबग करने में घंटों बर्बाद कर दिए। मैं गलत था। मुझे समझ नहीं आया था कि channels कैसे काम करते हैं।
अपने Go प्रोग्राम्स को हैंग होने से रोकने के लिए यहाँ तीन नियम दिए गए हैं।
- Nil channels ब्लैक होल की तरह होते हैं एक nil channel हमेशा के लिए ब्लॉक कर देता है। यदि आप nil channel पर कुछ भेजते या प्राप्त करते हैं, तो goroutine अटक जाता है।
- हमेशा अपने channels को
makeके साथ इनिशियलाइज़ करें। - यदि आप सुनिश्चित नहीं हैं, तो nil चेक का उपयोग करें।
- क्लोजिंग (Closing) के नियम पैनिक (panics) से बचाते हैं चैनल को क्लोज करना स्थायी होता है।
- केवल सेंडर (sender) को ही चैनल क्लोज करना चाहिए।
- क्लोज किए गए चैनल पर डेटा भेजने से panic होता है।
- यह जाँचने के लिए कि क्या चैनल क्लोज हो गया है, दूसरे रिटर्न वैल्यू का उपयोग करें:
v, ok := <-ch। - यदि
okfalse है, तो चैनल क्लोज हो चुका है।
- सुरक्षा के लिए channel directions का उपयोग करें Go आपको यह निर्दिष्ट करने की अनुमति देता है कि चैनल भेजने के लिए है या प्राप्त करने के लिए।
chan<- intका अर्थ है कि आप केवल डेटा भेज सकते हैं।<-chan intका अर्थ है कि आप केवल डेटा प्राप्त कर सकते हैं।- यह कंपाइलर को आपके कोड को चलाने से पहले गलतियों को पकड़ने के लिए मजबूर करता है।
एक क्लीन पाइपलाइन कैसे बनाएं:
- यह सुनिश्चित करने के लिए कि चैनल ठीक एक बार क्लोज हो,
defer closeका उपयोग करें। - Channels पर लूप चलाने के लिए
rangeका उपयोग करें। जब चैनल क्लोज होता है, तो यह अपने आप रुक जाता है। - सख्त कॉन्ट्रैक्ट्स बनाने के लिए अपने फंक्शन्स को डायरेक्शन टाइप्स असाइन करें।
जब आप इन पैटर्न्स का पालन करते हैं, तो आप लीक्स (leaks) और पैनिक (panics) को रोकते हैं। आप ऐसे सिस्टम बनाते हैं जिन्हें टेस्ट करना आसान और मजबूत (robust) होता है।
आपकी चुनौती:
एक ऐसा फंक्शन लिखें जो कई इनपुट चैनल्स को एक आउटपुट चैनल में मर्ज (merge) कर दे। एक select लूप का उपयोग करें। 500ms का टाइमआउट जोड़ें। सुनिश्चित करें कि कोई भी goroutine लीक न हो।
अपना समाधान कमेंट्स में पोस्ट करें।