GoDasturchi
Worker Implementation

Worker Implementation

Ishchi (worker) yaratish

Konveyer lentasi bo'yicha kelayotgan mahsulotlarni birma-bir olib, ularga ishlov beradigan ishchi bo'lsin. Bizning Worker ham xuddi shunday: navbatdan (kanaldan) vazifalarni birma-bir oladi, ularni BAJARADI, va natijani natija kanaliga yuboradi.

example.go
package main

import (
	"fmt"
	"strings"
)

type Task struct {
	ID      string
	Payload string
}

type Result struct {
	TaskID string
	Output string
}

// processTask — vazifani BAJARADIGAN funksiya (haqiqiy loyihada bu email
// yuborish, fayl qayta ishlash va h.k. bo'lardi)
func processTask(task *Task) string {
	return strings.ToUpper(task.Payload) + " - bajarildi"
}

// worker — kanaldan vazifa olib, uni bajaradi, natijani results'ga yuboradi
func worker(tasks <-chan *Task, results chan<- Result) {
	for task := range tasks {
		output := processTask(task)
		results <- Result{TaskID: task.ID, Output: output}
	}
}

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

	tasks <- &Task{ID: "task-1", Payload: "email yuborish"}
	close(tasks)

	worker(tasks, results)
	close(results)

	for result := range results {
		fmt.Println(result.TaskID, result.Output)
	}
}

tasks <-chan *Task va results chan<- Result — "Directional Channels" darsida ko'rgan naqsh: worker funksiyasi FAQAT tasksdan O'QIYDI (<-chan), FAQAT resultsga YOZADI (chan<-). Bu — funksiya imzosining O'ZI orqali "bu funksiya nima qila olishi va qila OLMASLIGI"ni aniq ko'rsatadi, tasodifiy xato (masalan resultsdan o'qishga urinish)ni COMPILE VAQTIDA ushlaydi.

for task := range tasks — kanal YOPILGUNCHA (close(tasks)) davom etadigan sikl ("Range over Channels" darsini eslang). Kanal yopilgandan keyin, ichidagi QOLGAN barcha elementlar hali ham o'qiladi, keyin sikl AVTOMATIK tugaydi — bu worker'ga "boshqa vazifa yo'q, ishni tugatsa bo'ladi" degan signal beradi.

>_ Exercise

Ikkita vazifani bitta worker orqali ketma-ket bajaring.

  • tasks kanaliga ikkita Task yuboring ("task-1", "payload-a") va ("task-2", "payload-b")
  • tasks kanalini yoping, worker(tasks, results) ni chaqiring, results kanalini yoping
  • results bo'ylab yurib, har birining TaskID va Output'ini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Yo'nalishli kanallar (<-chan, chan<-) funksiyaning kanal bilan qanday munosabatda bo'lishini compile vaqtida aniq belgilaydi; worker funksiyasi kanal yopilgunga qadar navbatdan vazifalarni olib, ularni bajarib boradi.

NEXT UP

Worker Pool

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Worker Implementation

Ishchi (worker) yaratish

Konveyer lentasi bo'yicha kelayotgan mahsulotlarni birma-bir olib, ularga ishlov beradigan ishchi bo'lsin. Bizning Worker ham xuddi shunday: navbatdan (kanaldan) vazifalarni birma-bir oladi, ularni BAJARADI, va natijani natija kanaliga yuboradi.

example.go
package main

import (
	"fmt"
	"strings"
)

type Task struct {
	ID      string
	Payload string
}

type Result struct {
	TaskID string
	Output string
}

// processTask — vazifani BAJARADIGAN funksiya (haqiqiy loyihada bu email
// yuborish, fayl qayta ishlash va h.k. bo'lardi)
func processTask(task *Task) string {
	return strings.ToUpper(task.Payload) + " - bajarildi"
}

// worker — kanaldan vazifa olib, uni bajaradi, natijani results'ga yuboradi
func worker(tasks <-chan *Task, results chan<- Result) {
	for task := range tasks {
		output := processTask(task)
		results <- Result{TaskID: task.ID, Output: output}
	}
}

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

	tasks <- &Task{ID: "task-1", Payload: "email yuborish"}
	close(tasks)

	worker(tasks, results)
	close(results)

	for result := range results {
		fmt.Println(result.TaskID, result.Output)
	}
}

tasks <-chan *Task va results chan<- Result — "Directional Channels" darsida ko'rgan naqsh: worker funksiyasi FAQAT tasksdan O'QIYDI (<-chan), FAQAT resultsga YOZADI (chan<-). Bu — funksiya imzosining O'ZI orqali "bu funksiya nima qila olishi va qila OLMASLIGI"ni aniq ko'rsatadi, tasodifiy xato (masalan resultsdan o'qishga urinish)ni COMPILE VAQTIDA ushlaydi.

for task := range tasks — kanal YOPILGUNCHA (close(tasks)) davom etadigan sikl ("Range over Channels" darsini eslang). Kanal yopilgandan keyin, ichidagi QOLGAN barcha elementlar hali ham o'qiladi, keyin sikl AVTOMATIK tugaydi — bu worker'ga "boshqa vazifa yo'q, ishni tugatsa bo'ladi" degan signal beradi.

>_ Exercise

Ikkita vazifani bitta worker orqali ketma-ket bajaring.

  • tasks kanaliga ikkita Task yuboring ("task-1", "payload-a") va ("task-2", "payload-b")
  • tasks kanalini yoping, worker(tasks, results) ni chaqiring, results kanalini yoping
  • results bo'ylab yurib, har birining TaskID va Output'ini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Yo'nalishli kanallar (<-chan, chan<-) funksiyaning kanal bilan qanday munosabatda bo'lishini compile vaqtida aniq belgilaydi; worker funksiyasi kanal yopilgunga qadar navbatdan vazifalarni olib, ularni bajarib boradi.

NEXT UP

Worker Pool