Как работает 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(), чтобы дедлайн и отмена гарантированно учитывались на всех уровнях.