एक गोरआउट लीक का एक उदाहरण और एक को कैसे डिबग करना है

जब मैं एक फ़ंक्शन का उपयोग करता हूं जो कि एक गोरोइन और संचार / रद्द करने के लिए चैनलों का उपयोग करके कोड का एक टुकड़ा चला रहा है, तो मुझे आमतौर पर गहराई से देखने के लिए लुभाया जाता है क्योंकि यह बहुत आसानी से गोरोइन लीक को पेश करने के लिए एक शानदार जगह है और ये त्रुटियां बहुत आसान हैं यहां तक ​​कि गैर-शुरुआत करने वाले गोलंग डेवलपर के लिए भी याद आती है। और यही मैंने KUDO में पाए गए इस कोड के टुकड़े के लिए किया।

गोरोइनिन रिसाव क्या है?

Leaking goroutine मूल रूप से मेमोरी लीक का एक प्रकार है। आप एक गोरोइन शुरू करते हैं, लेकिन यह कभी समाप्त नहीं होगा, हमेशा के लिए एक मेमोरी पर कब्जा कर लेता है जिसे उसने आरक्षित किया है। KUDO से पोस्ट किए गए उदाहरण को थोड़ा सरल करने के लिए, यह इस बात का एक उदाहरण है कि कैसे कोई अपने प्रोजेक्ट में गोरोइन लीक को पेश कर सकता है।

कोड क्या करता है कि एक लागू समयबाह्य है और एक समय-समय पर ऑपरेशन गोरोइन के अंदर चल रहा है। हर टिक, हम कुछ व्यावसायिक तर्क को सत्यापित करने की कोशिश करते हैं (यह दावा करते हैं कि कुछ स्वस्थ है / उदाहरण के लिए तैयार है) - इस उदाहरण में यह सिर्फ सोने और फिर लौटने से उस कॉल का अनुकरण करता है।

तो रिसाव कहां है? ऊपर सरलीकृत उदाहरण में, टाइमआउट सिर्फ 1 सेकंड है जबकि सत्यापित ऑपरेशन में 10 सेकंड लग रहे हैं। इसका मतलब है कि समय सीमा पहले लागू की जाएगी, 'वेटरेडी' से लौटकर। लगभग 9 सेकंड बाद, हमारे गोरोइन को सत्यापनकर्ता से परिणाम प्राप्त होता है और ईशान में लिखने की कोशिश करता है। असंबद्ध चैनल पर लिखना अवरुद्ध है और कोई भी उस चैनल पर नहीं सुन रहा है क्योंकि हम पहले ही प्रतीक्षा से लौट चुके हैं - और यहाँ हमारा लीक है!

कैसे पता करें कि क्या आपके पास गोरोइन का रिसाव है?

सामान्यतया, `रनटाइम` पैकेज यहां आपका मित्र है। एक तरीका है runtime.NumGoroutine () का उपयोग वेटरेडी फ़ंक्शन को कॉल करने से पहले और बाद में एक परीक्षण में। अगर प्रतीक्षा के बाद गोरोइटिन की संख्या और उसके बाद की स्थिति समान नहीं है, तो आपके पास एक रिसाव है।

एक अन्य विकल्प उबेर से एक पुस्तकालय का उपयोग करना है - गोलक। यदि आप इस बात पर गोता लगाते हैं कि किसी को कैसे लागू किया जाता है, तो यह रनटाइम पैकेज पर भी निर्भर करता है, इस बार यह सभी स्टैक (रनटाइम.टैक फ़ंक्शन) को पढ़ता है और उसके शीर्ष पर कुछ सुविधा विधियों का परिचय देता है।