কোনও চ্যানেল খোলা রাখা কি ঠিক আছে?


160

যদি আমি কখনই এর স্থিতি না পরীক্ষা করি তবে কোনও চ্যানেল চিরতরে খোলা রাখা (চ্যানেলটি কখনই বন্ধ করা হবে না) ঠিক আছে? এটি কি স্মৃতি ফাঁস হতে পারে? নিম্নলিখিত কোডটি কি ঠিক আছে?

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

উত্তর:


236

কোনও গো চ্যানেল চিরকাল খোলা রেখে দেওয়া এবং এটি কখনই বন্ধ না করা ঠিক। যখন চ্যানেলটি আর ব্যবহার করা হবে না, তখন এটি আবর্জনা সংগ্রহ করা হবে।

দ্রষ্টব্য যে কেবলমাত্র কোনও চ্যানেল বন্ধ করা দরকার যদি প্রাপক কোনও ঘনিষ্ঠ খুঁজছেন। চ্যানেলটি বন্ধ করা চ্যানেলের একটি নিয়ন্ত্রণ সংকেত যা সূচিত করে যে আর কোনও ডেটা অনুসরণ করে না।

নকশা প্রশ্ন: চ্যানেল বন্ধ


3
আমি নিশ্চিত নই যে আমি লিঙ্কটির প্রতিক্রিয়াতে একমত। আমার 2 জিবি পরিসরে একটি স্মৃতি ফাঁস হয়েছিল। আমি ঘনিষ্ঠটি যুক্ত করার সাথে সাথে গিজারটি একটি জটিল হয়ে উঠল।
রিচার্ড

9
@ রিচার্ড: পুরো থ্রেডটি সাবধানে পড়ুন। গো gcএর লেখক এবং gccgoচ্যানেল closeএর লেখক এর লেখক প্রয়োজন নেই, আপনি যদি না খুঁজছেন close। এটি অনুমোদনের পরামর্শ।
পিটারসো

6
@ পিটারসো, এটি হতে পারে তবে আমি জানি যা আমি দেখেছি এবং এটিই আমি রিপোর্ট করেছি তাই দয়া করে আমাকে বরখাস্ত করবেন না।
রিচার্ড

1
ভাল যদি আপনার একটি বাফার চ্যানেল থাকে তবে এতে বার্তা যুক্ত করা মেমরিটি ব্যবহার করা উচিত। তবে আপনার চ্যানেলটি যদি বাফার না করা হয় বা কিছু না যুক্ত করা হয় তবে মেমরির ব্যবহার বাড়বে না।
metakeule


31

হ্যাঁ, কোনও চ্যানেল খোলা রাখা ঠিক আছে। গো প্রোগ্রামিং ভাষার বই যেমন বলেছে:

আপনি প্রতিটি চ্যানেল এটি শেষ করার পরে বন্ধ করার দরকার নেই। চ্যানেলটি বন্ধ করা কেবলমাত্র তখনই প্রয়োজনীয় যখন গ্রাহকরা যে সমস্ত ডেটা প্রেরণ করা হয়েছে তা জানানো গুরুত্বপূর্ণ। কোনও চ্যানেল যা আবর্জনা সংগ্রহকারী অ্যাক্সেসযোগ্য তা নির্ধারণ করে তার সংস্থানগুলি বন্ধ আছে কিনা তা পুনরুদ্ধার করতে হবে। (খোলা ফাইলগুলির জন্য ঘনিষ্ঠ অপারেশনে এটিকে বিভ্রান্ত করবেন না। এটি শেষ করার পরে প্রতিটি ফাইলের ক্লোজ পদ্ধতিটি কল করা গুরুত্বপূর্ণ ))


7

হ্যাঁ, চ্যানেলটি উন্মুক্ত রাখা ঠিক আছে এবং বাস্তবে এটি সাধারণ। একটি চ্যানেল খোলা থাকলে তা চ্যানেল অবজেক্টের জন্য কোনও রেফারেন্স গঠন করে না এবং তাই এটি আবর্জনা সংগ্রহ করা থেকে বিরত রাখে না।


1

" গো চ্যানেলগুলি ব্যবহার করার একটি সাধারণ নীতিটি হ'ল রিসিভার দিক থেকে কোনও চ্যানেল বন্ধ না করা এবং চ্যানেলের একাধিক সমবর্তী প্রেরক থাকলে চ্যানেলটি বন্ধ না করা। "

উপরের উত্তরে যেমন স্পষ্টভাবে উল্লেখ করা হয়েছে যে ক্লিনআপের জন্য চিহ্নিত হওয়ার পরে প্রতিটি চ্যানেল শেষ পর্যন্ত GCed হবে, সুতরাং চ্যানেলটি কেবলমাত্র কেবলমাত্র তফাত ছাড়াই বন্ধ করা ছেড়ে দেওয়া ঠিক হবে যে চ্যানেলটি gcকয়েকটি চক্রের পরে উপলভ্য হতে পারে যদি স্পষ্টভাবে বন্ধ করা হয়নি।

এছাড়াও নীচের নিবন্ধগুলিতে এটি এবং এটি 1: এন, এন: 1 বা এম: এন এর ক্ষেত্রে কোনও চ্যানেল বন্ধ করার বিভিন্ন উপায় দেখায়: প্রেরক: গ্রহণকারী)


-5

গো আবর্জনা সংগ্রহ করা হয়, তাই আপনাকে সত্যিকার অর্থে কোনও কিছুই 'মুক্ত' করতে হবে না।

চ্যানেলগুলি বন্ধ করার সম্ভাবনা রয়েছে, তবে এটি বেশিরভাগ হিসাবে ব্যবহৃত হয় - বন্ধ (চ্যানেল) - গোরটাইন (বা মূল প্রোগ্রাম) বলুন যে সেই চ্যানেলে আর কিছুই প্রেরণ করা হবে না।


8
এএফআইএকি এমনকি কোনও আবর্জনা সংগৃহীত ভাষায় একজন প্রোগ্রামার এখনও অপরিকল্পিত সংস্থান মুক্ত করার জন্য দায়বদ্ধ, যেমন ফাইল, সকেট এবং এমন একটি বন্ধ করে দেওয়া। চ্যানেলটি কি ফাইলের মতো বন্ধ করার দরকার আছে?
ক্লুয়েগ

3
@ Kluyg উত্তর নেই। আপনি ওএস সংস্থান সম্পর্কে কথা বলছেন (কোন চ্যানেলগুলি নয়)। এটি কোনও সংস্থান এবং ভাষার উপর নির্ভর করে তবে সাধারণত ওসি রিসোর্সগুলি ম্যানুয়ালি বন্ধ করার পরামর্শ দেওয়া হয় কারণ জিসি তা না করে বরং এটি অবিজ্ঞানীবাদী বলেই করা হয়। সবচেয়ে সাধারণ সংশ্লিষ্ট gotcha হয় হয় অনেকগুলি ফাইল খুলুন ত্রুটি। আপনি ফাইলগুলি খোলেন চালিয়ে যান ... আপনি জিসি এমনটি করার প্রত্যাশা করছেন ... আপনার স্মৃতিশক্তি শেষ হবে না (অতএব জিসি লাথি দেয় না) ... আপনি ওএস স্তরের ফাইল বর্ণনাকারীর বাইরে চলে গেছেন। ওএস প্রক্রিয়াটি মেরে
ফেলেছে

পুরো সময় সঠিক হওয়ার সাথে সাথে কেন এটি এতগুলি নিম্নবর্ণ পেয়েছিল তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি এবং অন্যান্য স্বীকৃত উত্তরের মতোই বলেছে ...
এজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.