Sobes.tech
Middle

Go-da kontekstin istifadə halları haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

Go-da kontekst sorğuların həyat dövrünü idarə etmək və goroutine-lərin icrasını nəzarət etmək üçün istifadə olunur. Əsas istifadə halları:

  • İptal: Müəyyən bir sorğu ilə əlaqəli goroutine zəncirini ləğv etməyə imkan verir. Məsələn, əlaqəni bağlama və ya zaman aşımı zamanı.
  • Zaman aşımı: Əməliyyatın tamamlanması üçün son tarix təyin edir. Əgər əməliyyat bu müddətdə tamamlanmazsa, kontekst ləğv edilir. Bu, sonsuz gözləmələri qarşısını alır.
  • Sorğu-özəl məlumatların ötürülməsi: Müəyyən bir sorğu ilə əlaqəli məlumatları (məsələn, istifadəçi ID-si, izləmə identifikatoru) çağrı zənciri vasitəsilə, onların imzalarını dəyişmədən ötürməyə imkan verir.

İstifadə nümunələri:

  1. Siqnal ilə ləğv:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func worker(ctx context.Context, id int) {
    	for {
    		select {
    		case <-ctx.Done():
    			fmt.Printf("İşçi %d dayandırıldı\n", id)
    			return
    		default:
    			fmt.Printf("İşçi %d işləyir...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // İstənilən zaman ləğv etməyə zəmanət verir
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Konteksti ləğv edir
    
    	time.Sleep(500 * time.Millisecond) // Goroutine-lərin bitməsinə vaxt verir
    }
    
  2. Zaman aşımı:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func longOperation(ctx context.Context) error {
    	select {
    	case <-time.After(3 * time.Second): // Uzun əməliyyatın simulyasiyası
    		fmt.Println("Əməliyyat uğurla tamamlandı")
    		return nil
    	case <-ctx.Done():
    		fmt.Println("Əməliyyat kontekst tərəfindən ləğv edildi:", 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("Xəta:", err)
    	}
    }
    
  3. Məlumatların ötürülməsi:

    package main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	userID := ctx.Value(userIDKey).(int)
    	fmt.Printf("İstək işlənir, istifadəçi ID-si: %d\n", userID)
    	// İstəkə əlavə işləmə
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }
    

Əhəmiyyətlidir ki, context.Background() və ya context.TODO() əsas kontekst kimi istifadə olunsun və onu çağrı zəncirində aşağıya ötürəsiniz. Konteksti məlumat strukturlarında saxlamaq tövsiyə edilmir, əgər bu strukturun həyat dövrü ilə birbaşa əlaqəli deyilsə.