2011-12-21 11 views
78

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

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

उत्तर

106

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

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

Design Question: Channel Closing

+0

मुझे यकीन नहीं है कि मैं लिंक की प्रतिक्रिया से सहमत हूं। मेरे पास 2 जीबी रेंज में मेमोरी लीक थी। जैसे ही मैंने बंद किया, गीज़र एक ट्रिकल बन गया। – Richard

+0

@ रिचर्ड: पूरे धागे को ध्यान से पढ़ें। गो 'जीसी' के लेखक और 'ग्कोगो' के लेखक कहते हैं कि चैनल 'क्लोज़' आवश्यक नहीं है, जब तक कि आप 'बंद' की तलाश नहीं कर रहे हों। यह आधिकारिक सलाह है। – peterSO

+1

@ पीटर एसओ, यह हो सकता है लेकिन मुझे पता है कि मैंने क्या देखा और यही वह है जो मैंने रिपोर्ट किया है, इसलिए कृपया मुझे बर्खास्त न करें। – Richard

-1

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

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

+6

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

+0

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

1

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

11

हां, चैनल खोलना ठीक है। the go programming language पुस्तक के रूप में कहा गया:

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

संबंधित मुद्दे