Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: context, goroutine, cancellation, timeout, Go

Что такое context.WithCancel и context.WithTimeout и в каких случаях их следует применять? (*)

Вопрос проверяет понимание механизмов отмены и таймаутов в Go через пакет context, что необходимо для управления горутинами и предотвращения утечек ресурсов.

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

context.WithCancel создает контекст с функцией отмены, позволяя сигнализировать горутинам о необходимости завершения работы. context.WithTimeout добавляет автоматическую отмену через заданный промежуток времени. Они применяются для graceful shutdown, ограничения времени выполнения запросов и предотвращения утечек горутин.

Длинный ответ

Что такое context.WithCancel и context.WithTimeout?

В Go пакет context предоставляет стандартный способ передачи сигналов отмены и дедлайнов между горутинами. context.WithCancel создает дочерний контекст с функцией cancel, которую можно вызвать для отмены всех операций, использующих этот контекст. context.WithTimeout делает то же самое, но автоматически вызывает отмену по истечении заданного времени.

Как это работает?

Когда вы создаете контекст с помощью context.WithCancel, вы получаете новый контекст и функцию отмены. Вызов этой функции отправляет сигнал всем горутинам, которые слушают канал Done() этого контекста. context.WithTimeout внутри использует context.WithDeadline, устанавливая абсолютное время завершения.

Пример кода

package main

import (
	"context"
	"fmt"
	"time"
)

func worker(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("Worker stopped:", ctx.Err())
			return
		default:
			fmt.Println("Working...")
			time.Sleep(500 * time.Millisecond)
		}
	}
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()

	go worker(ctx)
	time.Sleep(3 * time.Second)
	fmt.Println("Main done")
}

Когда применять?

  • context.WithCancel — когда нужно вручную остановить группу горутин, например, при получении сигнала завершения от пользователя или при ошибке в одном из компонентов.
  • context.WithTimeout — для ограничения времени выполнения HTTP-запросов, операций с базой данных или любых других задач, которые не должны длиться бесконечно.

Итог: Используйте context.WithCancel для явного управления жизненным циклом горутин, а context.WithTimeout — для автоматического прерывания операций, превышающих допустимое время. Это ключевые инструменты для написания надежных и отзывчивых Go-приложений.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

Ключевые слова

#context

#goroutine

#cancellation

#timeout

#Go

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.