GoDasturchi
Task Status Tracking

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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