Sobes.tech
Senior

HTTP sorğusunun orijinal kontekstini GoRoutine-ə keçirsəniz nə baş verir?

sobes.tech Süni İntellekt

AI-dan cavab

Əgər HTTP sorğusunun orijinal kontekstini (context.Context) ayrı bir GoRoutine-ə keçirsəniz, bu kontekst bu kontekst ləğv olunduqda və ya vaxtı bitdikdə (məsələn, müştəri əlaqəni bağladıqda və ya vaxt bitdikdə) GoRoutine-dəki kontekst də ləğv olunacaq. Bu, kontekstə bağlı olan GoRoutine-in gözlənilmədən dayandırılmasına səbəb ola bilər.

Buna görə, əgər GoRoutine HTTP sorğusunun həyat dövründən müstəqil işləməlidirsə, ayrı bir kontekst yaratmaq (məsələn, context.Background() və ya context.WithCancel() istifadə etməklə) və erkən dayandırmadan qaçınmaq yaxşıdır. Əks halda, orijinal kontekstin istifadəsi sorğu ilə əlaqəli əməliyyatların həyat dövrünü düzgün idarə etmək üçün faydalıdır.

Nümunə:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Bu GoRoutine, ctx ləğv olunduqda sona çatacaq
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("İş tamamlandı")
        case <-ctx.Done():
            fmt.Println("Kontekst ləğv olundu")
        }
    }(ctx)
    w.Write([]byte("Cavab göndərildi"))
}