মূল কন্টেন্টে যান
মডিউল 7 · 2-এর পাঠ 5কোর্সে 32/50~15 min
মডিউল পাঠ (2/5)

চ্যানেল: টাইপ করা যোগাযোগ

চ্যানেল হল মধ্যকার যোগাযোগের মূর্খতামূলক প্রক্রিয়া গোরুটিন দ্য গো দর্শন (রব পাইক):

"মেমরি শেয়ার করে যোগাযোগ করবেন না; যোগাযোগের মাধ্যমে মেমরি শেয়ার করুন।"

একটি চ্যানেল হল একটি টাইপ করা ফিফো সারি, টাইপ-নিরাপদ এবং একযোগে নিরাপদ ব্যবহার go এর সাথে মিলিত, এটি Go এর প্রাথমিক বিল্ডিং ব্লক সঙ্গতি

তৈরি করুন, পাঠান, গ্রহণ করুন

Go
ch := make(chan int)     // canale di int, unbuffered

go func() {
    ch <- 42             // invia (può bloccare)
}()

v := <-ch                // ricevi (può bloccare)
fmt.Println(v)           // 42

সিনট্যাক্স:

  • make(chan T) বা make(chan T, N) বাফারের জন্য।
  • ch <- v পাঠায়।
  • v := <-ch গ্রহণ করে।
  • v, ok := <-ch একটি পতাকা সহ গ্রহণ করে (ok = false যদি চ্যানেলটি বন্ধ এবং খালি থাকে)।

Unbuffered: মিলন

একটি আনবাফার চ্যানেল (ক্ষমতা 0) ব্লক:

  • একজন রিসিভার প্রস্তুত না হওয়া পর্যন্ত প্রেরক;
  • একজন প্রেরক প্রস্তুত না হওয়া পর্যন্ত প্রাপক।

এটি একটি সিঙ্ক্রোনাস অ্যাপয়েন্টমেন্ট: একটি "সংকেত" বা গ্যারান্টি হিসাবে দরকারী যে মান বিতরণ করা হয়েছে.

বাফার করা হয়েছে: N পর্যন্ত সারি

Go
ch := make(chan int, 3)
ch <- 1   // non blocca
ch <- 2   // non blocca
ch <- 3   // non blocca
ch <- 4   // BLOCCA: il buffer è pieno

বাফার পূর্ণ হলেই প্রেরক ব্লক করে; শুধুমাত্র রিসিভার যখন এটি খালি হয়।

কাছাকাছি এবং পরিসরের জন্য

আর কোনো মান না থাকলে প্রেরক চ্যানেলটি বন্ধ করে দেয়:

Go
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)

for v := range ch {      // termina quando ch è chiuso E vuoto
    fmt.Println(v)
}

for range চ্যানেলটি বন্ধ না হওয়া পর্যন্ত (এবং নিষ্কাশন) একটি চ্যানেলে পুনরাবৃত্তি হয়। এটি "আগত সবকিছু গ্রাস" এর জন্য সবচেয়ে পরিষ্কার প্যাটার্ন।

স্বাক্ষরে দিকনির্দেশনা

ফাংশন পরামিতি দিক সীমাবদ্ধ করতে পারে:

Go
func producer(out chan<- int) {   // solo invio
    out <- 1
    close(out)
}

func consumer(in <-chan int) {    // solo ricezione
    for v := range in {
        fmt.Println(v)
    }
}

chan<- T = শুধুমাত্র পাঠানোর জন্য, <-chan T = শুধুমাত্র গ্রহণযোগ্য। একটি দ্বিমুখী চ্যানেল chan T যেকোনো একটিতে পাস করা যেতে পারে (অন্তর্ভুক্ত রূপান্তর)। এটা স্বচ্ছতা উন্নত করে এবং ভুল প্রতিরোধ করে।

সাধারণ নিদর্শন (প্রিভিউ)

  • শ্রমিক পুল: এন গোরুটিনগুলি jobs <-chan T থেকে গ্রহণ করে, results chan<- R এ উত্পাদন করে৷
  • পাইপলাইন: পর্যায়গুলি চ্যানেল দ্বারা সংযুক্ত।
  • সম্পন্ন সংকেত: একটি chan struct{} চ্যানেল "স্টপ" সংকেত দিতে বন্ধ।
Go
done := make(chan struct{})
go func() {
    <-done    // blocca finché qualcuno chiude done
    cleanup()
}()
close(done)   // segnale di stop

chan struct{} হল "সংকেত" চ্যানেল: পেলোডের শূন্য বাইট, শুধু সিঙ্ক্রোনাইজেশন

চেষ্টা করে দেখুন

ব্যায়াম#go.m7.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

একটি unbuffered int চ্যানেল ch তৈরি করুন, একটি goroutine থেকে 42 পাঠান, প্রধান প্রাপ্ত করুন এবং এটি প্রিন্ট করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

একটি বাফার ছাড়া, প্রেরক এবং রিসিভার সিঙ্ক্রোনাইজ.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m7.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

একটি বাফার করা চ্যানেলে 1,2,3 পাঠান, এটি বন্ধ করুন, তারপর পরিসীমা সহ সবকিছু মুদ্রণ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

একটি চ্যানেলের উপর `পরিসরের জন্য` শেষ হয় যখন চ্যানেলটি বন্ধ এবং নিষ্কাশন করা হয়।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m7.l2.e3
প্রস্তুত

যখন প্রেরক পাঠায় কিন্তু কোন রিসিভার প্রস্তুত না থাকে তখন একটি আনবাফারড চ্যানেল কী করে?

Go
ch := make(chan int)
ch <- 1 // ?
উত্তরের বিকল্প

রিক্যাপ

  • চ্যানেল = টাইপ করা ফিফো সারি, গোরুটিনের মধ্যে নিরাপদ।
  • আনবাফারড: মিলনস্থল (প্রেরক এবং প্রাপক সিঙ্ক্রোনাইজ)।
  • বাফার করা: ডিকপলিং, পূর্ণ/খালি হলেই ব্লক।
  • close(ch): শুধুমাত্র প্রেরক; for range বন্ধ না হওয়া পর্যন্ত ব্যবহার করে।
  • দিকনির্দেশনা: chan<- T (শুধু পাঠানোর জন্য), <-chan T (শুধুমাত্র প্রাপ্তি)।
  • chan struct{} বিশুদ্ধ সিঙ্ক্রোনাইজেশনের জন্য একটি সংকেত চ্যানেল হিসাবে৷