Sobes.tech
Senior

Šta se dešava ako prosledite originalni kontekst HTTP zahteva u GoRoutine?

sobes.tech АИ

Одговор од АИ

Ако пренесете оригиналниот контекст (context.Context) на HTTP-заявката в отделна GoRoutine, когато този контекст бъде отменен или истече (например, когато клиентът затвори връзката или изтече времето за изчакване), контекстът в GoRoutine също ще бъде отменен. Това може да доведе до неочаквано прекъсване на работата на 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("Отговорът е изпратен"))
}