GoDasturchi
Worker Pool Pattern

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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