Task Status Tracking
Vazifa holatini kuzatish
Pochta jo'natmasini kuzatish sahifasida "jo'natildi", "yo'lda", "yetkazildi" kabi holatlarni ko'rasiz — bu sizga jo'natma HOZIR qayerda ekanini aytadi, hatto siz uni jismonan ko'rmasangiz ham. Bizning Task Queue'da ham xuddi shunday — foydalanuvchi vazifasini yuborgandan keyin, uning HOZIRGI holatini (pending, running, completed, failed) BILISHNI xohlaydi.
package main
import (
"fmt"
"sync"
)
type TaskStatus string
const (
StatusPending TaskStatus = "pending"
StatusRunning TaskStatus = "running"
StatusCompleted TaskStatus = "completed"
)
// StatusTracker — barcha vazifalarning holatini markazlashtirib saqlaydi
type StatusTracker struct {
mu sync.RWMutex
statuses map[string]TaskStatus
}
func NewStatusTracker() *StatusTracker {
return &StatusTracker{statuses: make(map[string]TaskStatus)}
}
func (t *StatusTracker) SetStatus(taskID string, status TaskStatus) {
t.mu.Lock()
defer t.mu.Unlock()
t.statuses[taskID] = status
}
func (t *StatusTracker) GetStatus(taskID string) (TaskStatus, bool) {
t.mu.RLock()
defer t.mu.RUnlock()
status, ok := t.statuses[taskID]
return status, ok
}
func main() {
tracker := NewStatusTracker()
tracker.SetStatus("task-1", StatusPending)
tracker.SetStatus("task-1", StatusRunning)
tracker.SetStatus("task-1", StatusCompleted)
status, _ := tracker.GetStatus("task-1")
fmt.Println(status)
}StatusTracker — "URL Shortener"dagi Store bilan bir xil naqsh (sync.RWMutex + xarita), lekin endi vazifaning "hozirgi holatini" saqlaydi. Worker vazifani BOSHLASHDAN oldin SetStatus(id, StatusRunning), tugatgandan keyin SetStatus(id, StatusCompleted) chaqiradi — bu orqali TASHQI dunyo (masalan HTTP API orqali, keyingi darslarda) istalgan vaqtda vazifaning holatini SO'RASHI mumkin.
Bu — "Distributed Tracing Basics" darsida ko'rgan g'oyaning yana bir ko'rinishi: vazifaning "hayoti" davomida sodir bo'lgan HAR BIR o'zgarish, MARKAZIY bir joyda kuzatib boriladi, shuning uchun istalgan vaqtda "bu vazifa hozir qayerda?" degan savolga javob berish mumkin.
>_ Exercise
StatusTracker'ga barcha "running" holatidagi vazifalar sonini hisoblash imkonini qo'shing.
- •CountByStatus(status TaskStatus) int metodini yozing: RLock bilan, statuses bo'ylab yurib, mos keluvchilarni sanang
- •3 ta vazifaning holatini o'rnating: "t1"->Running, "t2"->Completed, "t3"->Running
- •CountByStatus(StatusRunning) natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Markazlashtirilgan StatusTracker orqali har bir vazifaning joriy holatini kuzatib borish, tashqi dunyoga (masalan HTTP API orqali) istalgan vaqtda "bu vazifa hozir qayerda?" degan savolga javob berish imkonini beradi.
NEXT UP
Retry Logic
$ go run main.go
Kodingizni ishga tushiring