Sobes.tech
Middle

Go'da kontekstdan foydalanish holatlari haqida gapirib bering.

sobes.tech AI

AIdan javob

Go'da kontekst so'rovlarning hayot aylanishini boshqarish va gorutinlarning bajarilishini nazorat qilish uchun ishlatiladi. Asosiy foydalanish holatlari:

  • Bekor qilish: Muayyan so'rov bilan bog'langan gorutinlar zanjirini bekor qilish imkonini beradi. Masalan, ulanishni yopish yoki timeout bo'lsa.
  • Timeout: Amalni bajarish uchun oxirgi muddatni belgilaydi. Agar operatsiya bu muddat ichida tugamasa, kontekst bekor qilinadi. Bu cheksiz kutishni oldini oladi.
  • So'rovga xos ma'lumotlarni uzatish: Muayyan so'rov bilan bog'liq ma'lumotlarni (masalan, foydalanuvchi ID, izlash identifikatori) chaqirish zanjiri orqali, ularning imzolarini o'zgartirmasdan uzatishga imkon beradi.

Foydalanish misollari:

  1. Signal bilan bekor qilish:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func worker(ctx context.Context, id int) {
    	for {
    		select {
    		case <-ctx.Done():
    			fmt.Printf("Ishchi %d to'xtatildi\n", id)
    			return
    		default:
    			fmt.Printf("Ishchi %d ishlamoqda...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Bekor qilishni kafolatlaydi
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Kontekstni bekor qilish
    
    	time.Sleep(500 * time.Millisecond) // Gorutinlar tugashiga vaqt berish
    }
    
  2. Timeout:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func longOperation(ctx context.Context) error {
    	select {
    	case <-time.After(3 * time.Second): // Uzun ishni simulyatsiya qilish
    		fmt.Println("Operatsiya muvaffaqiyatli yakunlandi")
    		return nil
    	case <-ctx.Done():
    		fmt.Println("Operatsiya kontekst tomonidan bekor qilindi:", ctx.Err())
    		return ctx.Err()
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	err := longOperation(ctx)
    	if err != nil {
    		fmt.Println("Xato:", err)
    	}
    }
    
  3. Ma'lumotlarni uzatish:

    package main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	userID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Foydalanuvchi ID uchun so'rovni qayta ishlash: %d\n", userID)
    	// So'rovni davom ettirish userID bilan
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }
    

Kontekstni ildiz sifatida context.Background() yoki context.TODO() dan foydalanish va uni chaqirish zanjiri bo'ylab uzatish muhimdir. Kontekstni ma'lumotlar tuzilmalarida saqlash tavsiya etilmaydi, agar u to'g'ridan-to'g'ri bu tuzilmaning hayot aylanishi bilan bog'liq bo'lmasa.