Ответ
Оба метода пакета context
создают контекст, который автоматически отменяется по истечении времени. Ключевое различие — в способе задания этого времени.
-
context.WithTimeout(parent, duration)
- Принимает относительный интервал времени (
time.Duration
). - Удобен, когда нужно ограничить операцию простым таймаутом: "выполнять не дольше 2 секунд".
// Контекст отменится через 2 секунды после его создания ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() // Важно всегда вызывать cancel()
- Принимает относительный интервал времени (
-
context.WithDeadline(parent, time)
- Принимает абсолютный момент времени (
time.Time
). - Идеален, когда есть общий дедлайн для цепочки операций: "все дочерние операции должны завершиться к 17:00".
// Рассчитываем дедлайн: сейчас + 2 секунды deadline := time.Now().Add(2 * time.Second) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel()
- Принимает абсолютный момент времени (
Когда что использовать?
WithTimeout
— самый частый выбор для простых таймаутов (HTTP-запросы, запросы к БД).WithDeadline
— полезен при пробрасывании общего дедлайна через несколько сервисов или функций. Если функция получает контекст с дедлайном, она может использовать его для своих дочерних операций.
Важный момент: под капотом context.WithTimeout(parent, duration)
является просто удобной обёрткой и вызывает context.WithDeadline(parent, time.Now().Add(duration))
.