Как работает context.Done() и почему закрытие канала получают все горутины?

Как работает context.Done() и почему закрытие канала получают все горутины? context.Done() — канал для наблюдения за отменой контекста возвращает канал, закрываемый при отмене или завершении заданного времени одно…

Короткий ответ

Что ответить на собеседовании

Как работает context.Done() и почему закрытие канала получают все горутины? context.Done() — канал для наблюдения за отменой контекста возвращает канал, закрываемый при отмене или завершении заданного времени одно закрытие одновременно уведомляет всех слушателей мультиплексирование сигнала отмены без блокировок и гонок горутины подключаются к каналу и реагируют на его закрытие подходит для согласованного завершения нескольких горутин используется в сетевых запросах, таймаутах и дедлайнах

Подробный разбор

Ответ с пояснениями

Как работает context.Done() и почему закрытие канала получают все горутины?

  • context.Done() — канал для наблюдения за отменой контекста
  • возвращает канал, закрываемый при отмене или завершении заданного времени
  • одно закрытие одновременно уведомляет всех слушателей
  • мультиплексирование сигнала отмены без блокировок и гонок
  • горутины подключаются к каналу и реагируют на его закрытие
  • подходит для согласованного завершения нескольких горутин
  • используется в сетевых запросах, таймаутах и дедлайнах

Главное: context.Done() предоставляет общий сигнал отмены, а закрытие этого канала сразу становится доступным всем горутинам.

Подробный ответ

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

context.Done() — метод интерфейса context.Context в Go, возвращающий канал, через который сообщается об отмене или завершении контекста. После закрытия канала все горутины, ожидающие его, узнают, что работу необходимо остановить. Событие закрытия доступно каждому получателю одновременно: уведомление приходит без блокировок и дополнительного ожидания.

Ключевые моменты

  • Канал Done() закрывается один раз. Такое закрытие работает как broadcast-событие: все горутины, выполняющие <-ctx.Done(), «просыпаются» и обрабатывают отмену.
  • Так можно согласованно отменить работу сразу в нескольких горутинах, выполняющих задачи параллельно и обязанных остановиться одновременно после отмены операции.
  • Закрытие канала эффективнее отправки отдельного сигнала: из закрытого канала можно мгновенно читать, поэтому сигнал не будет пропущен, как это может произойти при передаче значения через канал.

Практический контекст

В прикладных проектах context.Context обычно создают в основном потоке — например, для HTTP-запроса с таймаутом или возможностью отмены — а затем передают нескольким горутинам. Они ожидают <-ctx.Done(), чтобы корректно завершиться, освободить ресурсы и не допустить утечек. Например, в Go 1.18+ сетевые запросы и обращения к БД принято отменять через контекст и ctx.Done(), чтобы дедлайн и отмена гарантированно учитывались на всех уровнях.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку