GoDasturchi
Worker Pool

Worker Pool

Ishchilar puli (Worker Pool)

Bitta kassir bilan ishlaydigan do'kon — navbat uzun bo'ladi. Besh kassir bilan ishlaydigan do'kon esa mijozlarga BIR VAQTNING o'zida xizmat ko'rsatadi, navbat tezroq qisqaradi. Worker Pool — aynan shu g'oya: BITTA worker o'rniga, bir nechta worker BIR XIL navbatdan PARALLEL ravishda vazifa olib ishlaydi.

example.go
package main

import (
	"fmt"
	"sort"
	"strings"
	"sync"
)

type Task struct {
	ID      string
	Payload string
}

type Result struct {
	TaskID string
	Output string
}

func worker(tasks <-chan *Task, results chan<- Result, wg *sync.WaitGroup) {
	defer wg.Done()
	for task := range tasks {
		output := strings.ToUpper(task.Payload)
		results <- Result{TaskID: task.ID, Output: output}
	}
}

func main() {
	tasks := make(chan *Task, 5)
	results := make(chan Result, 5)

	var wg sync.WaitGroup
	const numWorkers = 3
	for i := 0; i < numWorkers; i++ {
		wg.Add(1)
		go worker(tasks, results, &wg)
	}

	for i := 1; i <= 5; i++ {
		tasks <- &Task{ID: fmt.Sprintf("task-%d", i), Payload: fmt.Sprintf("payload-%d", i)}
	}
	close(tasks)

	wg.Wait()
	close(results)

	var ids []string
	for result := range results {
		ids = append(ids, result.TaskID)
	}
	sort.Strings(ids)
	fmt.Println(len(ids), ids[0], ids[4])
}

sync.WaitGroup — "WaitGroups" darsida ko'rgan, bir nechta goroutine tugashini KUTISH uchun vosita: har bir worker ishga tushganda wg.Add(1), tugaganda defer wg.Done(), va mainwg.Wait() orqali BARCHA worker tugaguncha kutadi. Bu — 3 ta worker BIR XIL tasks kanalidan PARALLEL o'qiganda, hech biri boshqasining ishini takrorlamasligini (Go kanali buni AVTOMATIK ta'minlaydi — har bir vazifa faqat BITTA worker'ga boradi) va hammasi tugaguncha dastur to'xtamasligini kafolatlaydi.

Natijalar tartibi PARALLEL ishlash tufayli HAR SAFAR boshqacha bo'lishi mumkin (qaysi worker qaysi vazifani qachon olishi oldindan aniq emas) — shuning uchun bu misolda natijalarni sort.Strings bilan tartiblab, faqat SONI va CHEGARA qiymatlarini tekshiramiz, aniq tartibga emas.

>_ Exercise

Worker pool orqali bajarilgan vazifalar sonini hisoblang.

  • 4 ta worker bilan pool yarating, 8 ta vazifani navbatga qo'ying
  • Barcha worker tugashini kuting (wg.Wait), results kanalini yoping
  • results'dan qancha natija kelganini sanab, sonini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Worker Pool — bir nechta goroutine bir xil kanaldan parallel ravishda vazifa olib ishlashi orqali, vazifalarni tezroq bajarish imkonini beradi; sync.WaitGroup esa barcha worker tugashini ishonchli kutish uchun ishlatiladi.

NEXT UP

Task Status Tracking

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Worker Pool

Ishchilar puli (Worker Pool)

Bitta kassir bilan ishlaydigan do'kon — navbat uzun bo'ladi. Besh kassir bilan ishlaydigan do'kon esa mijozlarga BIR VAQTNING o'zida xizmat ko'rsatadi, navbat tezroq qisqaradi. Worker Pool — aynan shu g'oya: BITTA worker o'rniga, bir nechta worker BIR XIL navbatdan PARALLEL ravishda vazifa olib ishlaydi.

example.go
package main

import (
	"fmt"
	"sort"
	"strings"
	"sync"
)

type Task struct {
	ID      string
	Payload string
}

type Result struct {
	TaskID string
	Output string
}

func worker(tasks <-chan *Task, results chan<- Result, wg *sync.WaitGroup) {
	defer wg.Done()
	for task := range tasks {
		output := strings.ToUpper(task.Payload)
		results <- Result{TaskID: task.ID, Output: output}
	}
}

func main() {
	tasks := make(chan *Task, 5)
	results := make(chan Result, 5)

	var wg sync.WaitGroup
	const numWorkers = 3
	for i := 0; i < numWorkers; i++ {
		wg.Add(1)
		go worker(tasks, results, &wg)
	}

	for i := 1; i <= 5; i++ {
		tasks <- &Task{ID: fmt.Sprintf("task-%d", i), Payload: fmt.Sprintf("payload-%d", i)}
	}
	close(tasks)

	wg.Wait()
	close(results)

	var ids []string
	for result := range results {
		ids = append(ids, result.TaskID)
	}
	sort.Strings(ids)
	fmt.Println(len(ids), ids[0], ids[4])
}

sync.WaitGroup — "WaitGroups" darsida ko'rgan, bir nechta goroutine tugashini KUTISH uchun vosita: har bir worker ishga tushganda wg.Add(1), tugaganda defer wg.Done(), va mainwg.Wait() orqali BARCHA worker tugaguncha kutadi. Bu — 3 ta worker BIR XIL tasks kanalidan PARALLEL o'qiganda, hech biri boshqasining ishini takrorlamasligini (Go kanali buni AVTOMATIK ta'minlaydi — har bir vazifa faqat BITTA worker'ga boradi) va hammasi tugaguncha dastur to'xtamasligini kafolatlaydi.

Natijalar tartibi PARALLEL ishlash tufayli HAR SAFAR boshqacha bo'lishi mumkin (qaysi worker qaysi vazifani qachon olishi oldindan aniq emas) — shuning uchun bu misolda natijalarni sort.Strings bilan tartiblab, faqat SONI va CHEGARA qiymatlarini tekshiramiz, aniq tartibga emas.

>_ Exercise

Worker pool orqali bajarilgan vazifalar sonini hisoblang.

  • 4 ta worker bilan pool yarating, 8 ta vazifani navbatga qo'ying
  • Barcha worker tugashini kuting (wg.Wait), results kanalini yoping
  • results'dan qancha natija kelganini sanab, sonini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Worker Pool — bir nechta goroutine bir xil kanaldan parallel ravishda vazifa olib ishlashi orqali, vazifalarni tezroq bajarish imkonini beradi; sync.WaitGroup esa barcha worker tugashini ishonchli kutish uchun ishlatiladi.

NEXT UP

Task Status Tracking