Worker Pool Pattern
Worker Pool (ishchilar to'plami) naqshi
Tasavvur qiling, sizda 1000 ta kiyim bor va ularni yuvish kerak. Agar bittalab, ketma-ket yuvsangiz — juda uzoq davom etadi. Agar 1000 ta kir yuvish mashinasini bir vaqtda ishga tushirsangiz — bu ham amaliy emas (joy, elektr yetishmaydi). Oqilona yechim: masalan 5 ta mashina oling, va 1000 ta kiyimni ular orasida taqsimlab yuving.
Worker Pool naqshi — aynan shu g'oya: cheklangan sondagi "ishchi" goroutinelar (worker) doimiy ishlab turadi, va ular umumiy "vazifalar navbati"dan (channel) o'zlari ish olib, bajarib boradi. Bu "Concurrency Fundamentals" kursida ko'rgan goroutine va kanallarning eng ko'p ishlatiladigan amaliy qo'llanilishi.
package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
results <- j * 2
}
}
func main() {
jobs := make(chan int, 5)
results := make(chan int, 5)
var wg sync.WaitGroup
for w := 1; w <= 3; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
wg.Wait()
close(results)
sum := 0
for r := range results {
sum += r
}
fmt.Println(sum)
}Faqat 3 ta worker ishga tushirilgan (w := 1; w <= 3), lekin ular jami 5 ta vazifani bajarishadi — chunki har bir worker jobs kanalidan navbat bilan ish oladi (for j := range jobs), bo'sh turmaydi. close(jobs) — "boshqa yangi ish kelmaydi" degan signal: shundan keyin worker'lar qolgan ishlarni tugatib, range siklidan avtomatik chiqadi.
Nega ishchilar sonini cheklash muhim? Agar har bir vazifa uchun alohida goroutine yaratsangiz (masalan million ta vazifa uchun million goroutine), bu xotira va CPU'ni haddan tashqari band qilib qo'yishi mumkin. Worker Pool esa "bir vaqtning o'zida nechta ish bajarilishi mumkinligi"ni nazorat ostida ushlab turadi — resurslarni tejaydi.
>_ Exercise
Worker pool yordamida sonlarni kvadratga oshiring.
- •4 ta worker ishga tushiring, ular jobs kanalidan sonni olib, uni kvadratga (j*j) oshirib results'ga yozsin
- •1 dan 6 gacha bo'lgan sonlarni jobs'ga yuboring, so'ng yoping
- •barcha natijalarning yig'indisini hisoblab chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Worker Pool — cheklangan sondagi goroutine umumiy kanaldan ish olib bajaradigan naqsh; bu bir vaqtda bajariladigan ishlar sonini nazorat ostida saqlab, resurslarni tejaydi.
NEXT UP
Fan-Out / Fan-In Pattern
$ go run main.go
Kodingizni ishga tushiring