Channels के साथ Go Concurrency में महारत हासिल करें

मैंने एक बार Go में एक इमेज प्रोसेसिंग पाइपलाइन बनाई थी।

मैंने हर स्टेप के लिए goroutines का इस्तेमाल किया। मैंने उन्हें channels के साथ लिंक किया। मैंने रन (run) किया।

प्रोग्राम फ्रीज हो गया। मेमोरी का उपयोग बढ़ता गया। फिर वह बंद हो गया। कोई एरर नहीं आया। बस सन्नाटा था।

मैंने एक खराब शेड्यूलर को डीबग करने में घंटों बर्बाद कर दिए। मैं गलत था। मुझे समझ नहीं आया था कि channels कैसे काम करते हैं।

अपने Go प्रोग्राम्स को हैंग होने से रोकने के लिए यहाँ तीन नियम दिए गए हैं।

  1. Nil channels ब्लैक होल की तरह होते हैं एक nil channel हमेशा के लिए ब्लॉक कर देता है। यदि आप nil channel पर कुछ भेजते या प्राप्त करते हैं, तो goroutine अटक जाता है।
  1. क्लोजिंग (Closing) के नियम पैनिक (panics) से बचाते हैं चैनल को क्लोज करना स्थायी होता है।
  1. सुरक्षा के लिए channel directions का उपयोग करें Go आपको यह निर्दिष्ट करने की अनुमति देता है कि चैनल भेजने के लिए है या प्राप्त करने के लिए।

एक क्लीन पाइपलाइन कैसे बनाएं:

जब आप इन पैटर्न्स का पालन करते हैं, तो आप लीक्स (leaks) और पैनिक (panics) को रोकते हैं। आप ऐसे सिस्टम बनाते हैं जिन्हें टेस्ट करना आसान और मजबूत (robust) होता है।

आपकी चुनौती: एक ऐसा फंक्शन लिखें जो कई इनपुट चैनल्स को एक आउटपुट चैनल में मर्ज (merge) कर दे। एक select लूप का उपयोग करें। 500ms का टाइमआउट जोड़ें। सुनिश्चित करें कि कोई भी goroutine लीक न हो।

अपना समाधान कमेंट्स में पोस्ट करें।

स्रोत: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79