Middle
137
questionbank
Какие возможности предоставляет создание дочернего контекста данных в Go?
Ответ от нейросети
sobes.tech AI
Создание дочернего контекста (с помощью context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) предоставляет следующие возможности:
- Отмена: Позволяет отменить выполнение операций, запущенных в дочернем контексте, не влияя на родительский. Это достигается вызовом функции отмены, возвращаемой при создании контекста.
- Таймаут / Дедлайн: Ограничивает время выполнения операций. Если время истекает до завершения операции, контекст автоматически отменяется.
- Передача значений: Позволяет передавать специфичные для запроса или операции значения вниз по цепочке вызовов функций (например, идентификатор запроса, данные аутентификации), не изменяя сигнатуры функций.
- Иерархия: Создает иерархическую структуру контекстов. Отмена родительского контекста автоматически отменяет все его дочерние контексты.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Родительский контекст, который отменяется через 3 секунды
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Убедимся, что родительский контекст будет отменен
// Создаем дочерний контекст с отменой
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Убедимся, что дочерний контекст будет отменен
// Функция, которая ждет отмены контекста
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Этот блок выполнится, когда контекст будет отменен
fmt.Println("Дочерняя горутина отменяется:", ctx.Err())
}
}(childCtx) // Передаем дочерний контекст в горутину
// Искусственная задержка для демонстрации отмены
time.Sleep(5 * time.Second)
fmt.Println("Программа завершена")
}
В этом примере родительский контекст с таймаутом через 3 секунды автоматически вызовет отмену дочернего контекста, что приведет к завершению работы горутины. Дочерний контекст можно было бы отменить вручную, вызвав cancelChild(), до истечения таймаута родительского контекста.