ماڈیول اسباق (2/5)
چینلز: ٹائپ شدہ مواصلات
چینلز درمیان رابطے کے لیے محاوراتی طریقہ کار ہیں۔ گوروٹین گو فلسفہ (روب پائیک):
"میموری شیئر کرکے بات چیت نہ کریں؛ بات چیت کرکے میموری کو شیئر کریں۔"
چینل ایک ٹائپ شدہ FIFO قطار ہے، ٹائپ سیف اور کنکرنٹ کے لیے محفوظ ہے۔
استعمال کریں 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اگر چینل بند اور خالی ہے)۔
unbuffeed: ملاپ
ایک غیر بفر شدہ چینل (صلاحیت 0) بلاکس:
- بھیجنے والا جب تک وصول کنندہ تیار نہ ہو؛
- وصول کنندہ جب تک کہ بھیجنے والا تیار نہ ہو۔
یہ ایک ہم وقت ساز ملاقات ہے: "سگنل" یا ضمانت کے طور پر مفید کہ قیمت پہنچا دی گئی ہے۔
بفرڈ: N تک قطار
ch := make(chan int, 3)
ch <- 1 // non blocca
ch <- 2 // non blocca
ch <- 3 // non blocca
ch <- 4 // BLOCCA: il buffer è pienoبھیجنے والا صرف اس وقت روکتا ہے جب بفر بھرا ہوا ہو۔ صرف وصول کنندہ جب یہ خالی ہے.
قریب اور حد کے لیے
بھیجنے والا چینل کو بند کر دیتا ہے جب مزید اقدار نہ ہوں:
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 ایک چینل پر اس وقت تک دہرایا جاتا ہے جب تک کہ چینل بند نہ ہو جائے (اور خشک ہو جائے)۔
یہ "آنے والی ہر چیز کو استعمال کریں" کا صاف ترین نمونہ ہے۔
دستخطوں میں سمتیت
فنکشن پیرامیٹرز سمت کو محدود کر سکتے ہیں:
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 کو یا تو (مضمون تبدیلی) کو منتقل کیا جا سکتا ہے۔ یہ
وضاحت کو بہتر بناتا ہے اور غلطیوں کو روکتا ہے۔
عام پیٹرن (پیش نظارہ)
- ورکر پول: N گوروٹینز
jobs <-chan Tسے استعمال کرتے ہیں،results chan<- Rپر پیداوار کرتے ہیں۔ - پائپ لائن: چینلز کے ذریعے منسلک مراحل۔
- ڈن سگنل: ایک
chan struct{}چینل "روکنے" کے سگنل کے لیے بند ہے۔
done := make(chan struct{})
go func() {
<-done // blocca finché qualcuno chiude done
cleanup()
}()
close(done) // segnale di stopchan struct{} "سگنل" چینل ہے: پے لوڈ کے صفر بائٹس، بس
ہم وقت سازی
اسے آزمائیں
ایک غیر بفر شدہ int چینل ch بنائیں، گوروٹین سے 42 بھیجیں، مین میں وصول کریں اور اسے پرنٹ کریں۔
اشارہ دکھائیں۔
بفر کے بغیر، بھیجنے والا اور وصول کنندہ مطابقت پذیر ہوتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
بفر شدہ چینل پر 1,2,3 بھیجیں، اسے بند کریں، پھر ہر چیز کو فار رینج کے ساتھ پرنٹ کریں۔
اشارہ دکھائیں۔
ایک چینل پر `رینج کے لیے` اس وقت ختم ہو جاتا ہے جب چینل بند ہو اور خشک ہو جائے۔
3 کوششوں کے بعد حل دستیاب ہے۔
جب بھیجنے والا بھیجتا ہے لیکن کوئی وصول کنندہ تیار نہیں ہوتا ہے تو UNBUFFERED چینل کیا کرتا ہے؟
ch := make(chan int)
ch <- 1 // ?Recap
- چینل = ٹائپ شدہ FIFO قطار، گوروٹینز کے درمیان محفوظ۔
- Unbuffered: ملاپ (بھیجنے والا اور وصول کنندہ مطابقت پذیر)۔
- بفرڈ: ڈیکپلنگ، صرف مکمل/خالی ہونے پر بلاکس۔
close(ch): صرف بھیجنے والا؛for rangeبند ہونے تک استعمال کرتا ہے۔- سمت بندی:
chan<- T(صرف بھیجنے کے لئے)،<-chan T(صرف وصول کرنے کے لئے)۔ chan struct{}خالص مطابقت پذیری کے لیے ایک سگنل چینل کے طور پر۔