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.
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.
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
$ go run main.go
Kodingizni ishga tushiring