Проверяет понимание особенностей передачи контекста HTTP-запроса в горутины и связанных с этим рисков.
В Go контекст (context.Context) передаёт сигналы отмены, дедлайны и значения через границы API. Для HTTP-запроса контекст создаётся автоматически и отменяется, когда запрос завершается (например, клиент закрыл соединение или обработчик вернул ответ).
Если вы передаёте оригинальный контекст запроса в горутину, то при завершении запроса контекст будет отменён. Это приведёт к тому, что горутина, которая использует этот контекст (например, для выполнения HTTP-запроса или работы с БД), получит сигнал отмены и прекратит выполнение. Это может быть желаемым поведением, если горутина должна быть привязана к жизненному циклу запроса. Однако если горутина выполняет фоновую задачу, которая должна продолжаться после ответа клиенту, использование оригинального контекста приведёт к её преждевременной остановке.
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func() {
// Этот запрос будет отменён, когда handler вернёт ответ
doWork(ctx)
}()
w.Write([]byte("ok"))
}В этом примере горутина начнёт выполнение, но как только handler завершится, контекст будет отменён, и doWork может прерваться.
Если горутина должна работать независимо от запроса, создайте новый контекст на основе context.Background() или context.WithTimeout. Например:
go func() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
doWork(ctx)
}()Такой подход гарантирует, что горутина не будет отменена из-за завершения HTTP-запроса.
Передавайте оригинальный контекст запроса в горутину только тогда, когда задача должна быть отменена вместе с запросом. Для фоновых операций всегда создавайте новый контекст, чтобы избежать неожиданных прерываний.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Golang Developer в телеграм