क्या किसी चैनल को खुला छोड़ देना ठीक है?


160

क्या मैं एक गो चैनल को हमेशा के लिए खुला छोड़ दूंगा (चैनल को कभी भी बंद न करें) अगर मैं इसके राज्य की जांच कभी नहीं करूं? क्या इससे मेमोरी लीक होगी? निम्नलिखित कोड ठीक है?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}

जवाबों:


236

गो चैनल को हमेशा के लिए खुला छोड़ना और इसे कभी बंद न करना ठीक है। जब चैनल का उपयोग नहीं किया जाता है, तो यह कचरा एकत्र किया जाएगा।

ध्यान दें कि यदि रिसीवर किसी करीबी की तलाश में है तो चैनल को बंद करना आवश्यक है। चैनल को बंद करना चैनल पर एक नियंत्रण संकेत है जो यह दर्शाता है कि कोई और डेटा अनुसरण नहीं करता है।

डिजाइन प्रश्न: चैनल समापन


3
मुझे यकीन नहीं है कि मैं लिंक की प्रतिक्रिया से सहमत हूं। मैंने 2GB रेंज में मेमोरी लीक की थी। जैसे ही मैंने क़रीब से जोड़ा गीज़र एक ट्रिकल बन गया।
रिचर्ड

9
@ रीचर्ड: पूरे सूत्र को ध्यान से पढ़ें। गो gcके लेखक और gccgoकहने के चैनल closes के लेखक आवश्यक नहीं हैं, जब तक कि आप एक की तलाश में नहीं हैं close। यह आधिकारिक सलाह है।
peterSO

6
@peterSO, यह हो सकता है लेकिन मुझे पता है कि मैंने जो देखा और जो मैंने रिपोर्ट किया है, कृपया मुझे खारिज न करें।
रिचर्ड

1
यदि आपके पास एक बफर चैनल है, तो उसमें संदेश जोड़कर मेमोरी का उपयोग करना चाहिए। हालाँकि, यदि आपका चैनल बफ़र्ड नहीं है या कुछ भी नहीं जोड़ा गया है तो मेमोरी उपयोग नहीं बढ़ेगा।
०४

फिर इसके बारे में क्या: group.google.com/forum/# ​​.topic / golang-nuts / bfuwmhbZHYw ?
कामिल डेजिडिक

31

हां, चैनल खुला रखना ठीक है। जैसा कि गो प्रोग्रामिंग भाषा की पुस्तक में कहा गया है:

जब आप इसके साथ समाप्त कर लें तो आपको हर चैनल को बंद करने की आवश्यकता नहीं है। यह केवल चैनल को बंद करने के लिए आवश्यक है जब यह प्राप्त करने के लिए महत्वपूर्ण है कि सभी डेटा भेजे गए हैं। एक चैनल जिसे कचरा कलेक्टर अप्राप्य होने के लिए निर्धारित करता है, उसके संसाधनों को फिर से प्राप्त किया जाएगा या नहीं, इसे बंद कर दिया जाएगा। (खुली फ़ाइलों के लिए बंद संचालन के साथ इसे भ्रमित न करें। जब आप इसके साथ समाप्त कर लें तो हर फ़ाइल पर बंद विधि को कॉल करना महत्वपूर्ण है।)


7

हां, चैनल को खुला छोड़ना ठीक है, और वास्तव में यह विशिष्ट है। एक चैनल खुला होना चैनल ऑब्जेक्ट के संदर्भ का गठन नहीं करता है, और इसलिए यह कचरा एकत्र होने से नहीं रखता है।


1

" गो चैनल का उपयोग करने का एक सामान्य सिद्धांत रिसीवर की तरफ से एक चैनल को बंद नहीं करना है और यदि चैनल में कई समवर्ती कंधे हैं तो चैनल को बंद न करें। "

जैसा कि ऊपर दिए गए उत्तर में स्पष्ट रूप से उल्लेख किया गया है कि प्रत्येक चैनल को सफाई के लिए चिह्नित होने के बाद अंततः GCed किया जाएगा, इसलिए चैनल को बिना बंद किए छोड़ देना ठीक है, केवल यही अंतर होगा कि यह चैनल gcकुछ चक्रों के बाद के लिए उपलब्ध होगा, यदि स्पष्ट रूप से बंद नहीं हुआ।

निम्नलिखित लेख भी यह और यह 1: एन, एन: 1 या एम: एन (प्रेषक: रिसीवर) के मामले में एक चैनल को बंद करने के विभिन्न तरीके दिखाता है


-5

गो कचरा एकत्र किया जाता है, इसलिए आपको वास्तव में कुछ भी 'मुक्त' करने की आवश्यकता नहीं है।

चैनलों को बंद करने की संभावना है, लेकिन इसका उपयोग ज्यादातर - क्लोज (चैनल) के रूप में किया जाता है - गोरोइन (या मुख्य कार्यक्रम) को बताएं कि उस चैनल पर कुछ और नहीं भेजा जाएगा।


8
AFAIK भी एक कचरा एकत्र की भाषा में एक प्रोग्रामर अभी भी अप्रबंधित संसाधनों को मुक्त करने के लिए जिम्मेदार है, उदाहरण के लिए फाइलें, सॉकेट्स और इतने पर बंद करना। क्या मुझे फाइल की तरह चैनल बंद करने की आवश्यकता है?
क्लूज

3
@Kluyg जवाब नहीं है। आप ओएस संसाधनों (जो चैनल नहीं हैं) के बारे में बात कर रहे हैं। यह एक संसाधन और भाषा पर निर्भर करता है, लेकिन आमतौर पर ओएस संसाधनों को मैन्युअल रूप से बंद करने की सिफारिश की जाती है, क्योंकि जीसी ऐसा नहीं करेगा, बल्कि इसलिए कि यह nondetermalistic है। सबसे आम संबंधित पकड़ लिया है भी कई खुली फ़ाइलों त्रुटि। आप फाइलें खोलते रहते हैं ... आपको उम्मीद है कि जीसी ऐसा करेगा ... आप मेमोरी से बाहर नहीं चलते हैं (इसलिए जीसी किक नहीं करता है ...) आप ओएस स्तर पर फ़ाइल डिस्क्रिप्टर से बाहर भागते हैं। ओएस प्रक्रिया को मारता है :)
पीजूसन

मैं इस बारे में उलझन में हूँ कि यह पूरे समय में सही होने के कारण इतने डाउनवोट क्यों हो गए और अन्य स्वीकृत उत्तरों के समान हैं ...
eja
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.