Channel Pipelines: Composing Concurrent Stages
Kanal pipeline'lari: concurrent bosqichlarni birlashtirish
Channels darsida bitta goroutina natijalarni bitta kanalga yubordi. Endi bir qadam oldinga: bir nechta bosqichni zanjirlab, har birining chiqishi keyingisining kirishi bo'ladigan pipeline qurish mumkin — bu YAML Data Pipeline kursidagi funksiyalarni ketma-ket chaqirish g'oyasining concurrent versiyasi, faqat endi har bir bosqich o'z goroutinasida mustaqil ishlaydi.
func Generate(nums []int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for _, n := range nums {
out <- n
}
}()
return out
}
func Square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for n := range in {
out <- n * n
}
}()
return out
}
// birlashtirish: Square(Generate(nums))Har bir funksiya <-chan int (faqat-qabul qilish kanali) qaytaradi — bu Channel Directions darsida ko'rasiz turdagi cheklovning tabiiy qo'llanilishi. Square(Generate(nums)) yozilganda, ikkita mustaqil goroutina bir vaqtda ishlaydi: biri sonlarni yaratadi, ikkinchisi ularni darhol kvadratga oshiradi — natijalar tayyor bo'lishi bilanoq keyingi bosqichga oqib boradi.
>_ Exercise
Generate(nums []int) <-chan int funksiyasini yozing — u yangi kanal ochib, alohida goroutinada numsdagi har bir sonni kanalga yuboradi va yopadi, kanalni qaytaradi. Square(in <-chan int) <-chan int funksiyasini yozing — u indan har bir sonni o'qib, uning kvadratini yangi chiqish kanaliga yuboradi va yopadi. mainda ikkalasini Square(Generate(nums)) sifatida birlashtiring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Har bir bosqichni "kanal qabul qiladi, kanal qaytaradi" shaklida yozib, mustaqil goroutinalarni bir-biriga ulash mumkin — bu pipeline naqshi. Har bir bosqich o'z ishini bajarayotganda, boshqa bosqichlar allaqachon keyingi ma'lumot ustida ishlayotgan bo'ladi.
NEXT UP
Channel Directions: Type-Safe Communication
$ go run main.go
Kodingizni ishga tushiring