РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1365 of 1593 menu

Метод context.Context.Done

Метод Done интерфейса context.Context возвращает канал, который закрывается при отмене контекста или превышении таймаута. Этот канал используется для получения сигнала об отмене и позволяет грациозно завершить работу горутин. Метод не принимает никаких параметров и возвращает канал типа <-chan struct{}.

Синтаксис

ctx.Done()

Пример

Давайте создадим контекст с отменой и обработаем сигнал от канала Done:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { time.Sleep(2 * time.Second) cancel() }() select { case <-ctx.Done(): fmt.Println("Context cancelled") } }

Результат выполнения кода:

"Context cancelled"

Пример

Рассмотрим пример с таймаутом. Канал Done закроется по истечении заданного времени:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() select { case <-ctx.Done(): fmt.Println("Timeout exceeded") } }

Результат выполнения кода:

"Timeout exceeded"

Пример

Используем Done для остановки долгой операции в горутине:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { for { select { case <-ctx.Done(): fmt.Println("Stopping goroutine") return default: fmt.Println("Working...") time.Sleep(500 * time.Millisecond) } } }() time.Sleep(2 * time.Second) cancel() time.Sleep(1 * time.Second) }

Результат выполнения кода:

"Working..." "Working..." "Working..." "Working..." "Stopping goroutine"

Пример

Проверим, что канал Done не блокирует выполнение программы при отсутствии отмены:

package main import ( "context" "fmt" ) func main() { ctx := context.Background() select { case <-ctx.Done(): fmt.Println("This will not print") default: fmt.Println("No cancellation signal") } }

Результат выполнения кода:

"No cancellation signal"

Смотрите также

  • метод Context,
    который возвращает контекст
  • метод Err,
    который возвращает ошибку отмены контекста
  • метод Deadline,
    который возвращает время дедлайна контекста
  • функцию WithCancel,
    которая создает контекст с возможностью отмены
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить