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) {
        // ეს გორუტინა დასრულდება, თუ ctx გაუქმდება
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("სამუშაო დასრულდა")
        case <-ctx.Done():
            fmt.Println("კონტექსტი გაუქმდა")
        }
    }(ctx)
    w.Write([]byte("პასუხი გაგზავნილია"))
}