Sobes.tech
Senior
25

Что происходит если передать оригинальный контекст от HTTP запроса в GoRoutine?

Компании, где спрашивали
Гос крипта

Ответ от нейросети

sobes.tech AI

Если передать оригинальный контекст (context.Context) HTTP-запроса в отдельную 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("Ответ отправлен"))
}