Проверяет понимание передачи контекста в горутины в Go, включая отмену и таймауты.
Горутины — это легковесные потоки в Go, но они не управляются автоматически. Если запустить горутину без контроля, она может работать вечно, даже если основная программа уже завершилась. Контекст (context.Context) — это стандартный механизм для передачи сигналов отмены, дедлайнов и значений между горутинами. Он позволяет родительской горутине остановить дочерние, когда результат больше не нужен.
Контекст всегда передается первым параметром функции. Никогда не храните его в структуре — это считается плохой практикой. Создайте контекст с помощью context.Background() или context.TODO() в начале программы, а затем оборачивайте его в производные контексты с отменой или таймаутом.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
go doWork(ctx)
func doWork(ctx context.Context) {
select {
case <-ctx.Done():
fmt.Println("Отменено:", ctx.Err())
return
case <-time.After(5 * time.Second):
fmt.Println("Работа завершена")
}
}В этом примере горутина завершится через 2 секунды, даже если работа занимает 5 секунд. Ключевой момент — проверка ctx.Done() в select. Это позволяет горутине реагировать на отмену и освобождать ресурсы.
Вывод: Правильная передача контекста — это стандарт идиоматичного Go. Она обеспечивает управляемость горутин, предотвращает утечки и делает код предсказуемым. Применяйте контекст везде, где есть потенциально долгие операции: сетевые запросы, работа с БД, фоновые задачи.