Buffered Channels: Decoupling Producers and Consumers
Buferlangan kanallar: ishlab chiqaruvchi va iste'molchini ajratish
Oddiy make(chan int) — sig'imi noldagi, buferlanmagan kanal: yuborish darhol qabul qiluvchini talab qiladi, ya'ni ishlab chiqaruvchi (producer) va iste'molchi (consumer) har doim bir-birini kutishga majbur. make(chan int, N) esa buferlangan kanal yaratadi — u navbat kabi ishlaydi va hech kim qabul qilmasa ham N tagacha qiymatni saqlab turishi mumkin, ya'ni ikkalasini bir-biridan ajratadi (decouple).
ch := make(chan int, 3)
ch <- 1 // bloklanmaydi — buferda joy bor
ch <- 2 // bloklanmaydi
ch <- 3 // bloklanmaydi, endi bufer to'ldi
// ch <- 4 shu yerda bloklanardi — biror kishi qabul qilgunchaBu — Composite Types kursidagi slice'ning cap (sig'im) tushunchasiga o'xshaydi: bufer — kanal ichidagi vaqtinchalik "joy". Producer tezroq ishlaydigan, consumer sekinroq bo'lgan holatlarda bufer ikkalasining tezligidagi vaqtinchalik farqni yumshatadi — bufer to'lgandan keyingi har qanday yuborish esa, qandaydir qiymat qabul qilinib bo'shliq ochilguncha kutadi.
>_ Exercise
FillBuffer(n int) []int funksiyasini yozing. n sig'imli buferlangan kanal yarating, 0 dan n-1 gacha bo'lgan har bir i uchun uning kvadratini kanalga yuboring (goroutinasiz — bufer yetarli bo'lgani uchun bloklanish bo'lmaydi), kanalni yoping, so'ngra range bilan barcha qiymatlarni slice'ga yig'ib qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Buferlangan kanal (make(chan T, N)) producer va consumer'ni bir-biridan ajratadi: producer qabul qiluvchini kutmasdan N tagacha qiymatni "navbatga qo'yishi" mumkin. Bufer to'lgach, yuborish yana buferlanmagan kanaldagidek bloklanadigan bo'lib qoladi.
NEXT UP
Select Statement: Multiplexing Channels
$ go run main.go
Kodingizni ishga tushiring