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("Պատասխան ուղարկվեց"))
}