GoDasturchi
Buffered Channels: Decoupling Producers and Consumers

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).

example.go
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 qilguncha

Bu — 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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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).

example.go
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 qilguncha

Bu — 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.

Hints (0/3)

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