Sobes.tech
Senior

Ի՞նչ է տեղի ունենում, եթե փոխանցեք HTTP հարցման բնօրինակ կոնտեքստը GoRoutine-ին:

sobes.tech AI

Պատասխան AI-ից

Եթե փոխանցեք HTTP հարցման սկզբնական կոնտեքստը (context.Context) առանձին GoRoutine-ին, ապա երբ այդ կոնտեքստը չեղարկվի կամ լրանա (օրինակ, երբ հաճախորդը կապը կտրի կամ սպասման ժամանակը լրանա), ապա այդ կոնտեքստը նաև չեղարկված կլինի։ Սա կարող է անակնկալ ընդհատումների պատճառ լինել, եթե այն կախված է այդ կոնտեքստից։

Հետևաբար, եթե goroutine-ն պետք է աշխատի անկախ HTTP հարցման կյանքի ցիկլից, խորհուրդ է տրվում ստեղծել առանձին կոնտեքստ (օրինակ, օգտագործելով context.Background() կամ context.WithCancel()), որպեսզի կանխվի վաղաժամ ավարտը։ Այլապես, սկզբնական կոնտեքստի օգտագործումը օգտակար է հարցման հետ կապված գործողությունների կյանքի ժամանակը ճիշտ կառավարելու համար։

Օրինակ՝

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Այս goroutine-ն կավարտվի, եթե ctx-ն չեղարկվի
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Աշխատանքը ավարտվեց")
        case <-ctx.Done():
            fmt.Println("Կոնտեքստը չեղարկվեց")
        }
    }(ctx)
    w.Write([]byte("Պատասխան ուղարկվեց"))
}