𝗠𝗮𝘀𝘁𝗲𝗿 𝗚𝗼 𝗖𝗼𝗻𝗰𝘂𝗿𝗿𝗲𝗻𝗰𝘆 𝗪𝗶𝘁𝗵 𝗖𝗵𝗮𝗻𝗻𝗲𝗹𝘀
मी एकदा Go मध्ये एक इमेज प्रोसेसिंग पाइपलाइन तयार केली होती.
मी प्रत्येक स्टेपसाठी goroutines वापरले. त्यांना channels ने जोडले. आणि रन केले.
प्रोग्राम फ्रीझ झाला. मेमरीचा वापर वाढला. आणि मग तो बंद पडला. कोणताही एरर आला नाही. फक्त शांतता होती.
मी तासनतास एका खराब शेड्यूलरला डीबग करण्यात घालवले. मी चुकीचा होतो. मला channels कसे काम करतात हे समजले नव्हते.
तुमचे Go प्रोग्राम्स हँग होऊ नयेत यासाठी येथे तीन नियम दिले आहेत.
- Nil channels हे ब्लॅक होल (black holes) आहेत एक nil channel कायमचे ब्लॉक करते. जर तुम्ही nil channel वर डेटा पाठवला किंवा प्राप्त केला, तर goroutine अडकून पडते.
- तुमचे channels नेहमी
makeने इनिशियलाइज करा. - जर तुम्हाला खात्री नसेल, तर nil चेक वापरा.
- क्लोजिंगचे नियम 'panics' टाळतात चॅनेल क्लोज करणे ही कायमस्वरूपी प्रक्रिया आहे.
- फक्त पाठवणारे (sender) चॅनेल क्लोज केले पाहिजे.
- क्लोज केलेल्या चॅनेलवर डेटा पाठवल्यास 'panic' होतो.
- चॅनेल क्लोज झाले आहे की नाही हे तपासण्यासाठी दुसऱ्या रिटर्न व्हॅल्यूचा वापर करा:
v, ok := <-ch. - जर
okfalse असेल, तर चॅनेल क्लोज झाले आहे.
- सुरक्षिततेसाठी channel directions वापरा Go तुम्हाला चॅनेल डेटा पाठवण्यासाठी आहे की प्राप्त करण्यासाठी हे निर्दिष्ट करण्याची परवानगी देते.
chan<- intम्हणजे तुम्ही फक्त डेटा पाठवू शकता.<-chan intम्हणजे तुम्ही फक्त डेटा प्राप्त करू शकता.- यामुळे तुमचा कोड रन करण्यापूर्वीच कंपायलर चुका शोधण्यास भाग पाडतो.
एक स्वच्छ पाइपलाइन कशी तयार करावी:
- चॅनेल नेमके एकदाच क्लोज होईल याची खात्री करण्यासाठी
defer closeवापरा. - channels वर लूप करण्यासाठी
rangeवापरा. चॅनेल क्लोज झाल्यावर हे आपोआप थांबते. - कडक नियम (strict contracts) तयार करण्यासाठी तुमच्या फंक्शन्सना direction types द्या.
जेव्हा तुम्ही या पॅटर्नचे पालन करता, तेव्हा तुम्ही लीक्स (leaks) आणि पॅनिक्स (panics) टाळता. तुम्ही सहज टेस्ट करता येतील आणि मजबूत (robust) अशी सिस्टिम्स तयार करता.
तुमचे आव्हान:
एक असे फंक्शन लिहा जे अनेक इनपुट चॅनेल्सना एका आउटपुट चॅनेलमध्ये विलीन (merge) करेल. select लूप वापरा. 500ms चा टाइमआउट जोडा. कोणतीही goroutine लीक होणार नाही याची खात्री करा.
तुमचे उत्तर कमेंट्समध्ये पोस्ट करा.