Можно ли ограничить время работы горутины с помощью context в Go?

Тайм-аут сигнализирует об отмене, но не убивает горутину. Сотрудничающая операция, освобождение ресурсов и ожидание завершения.

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

Что ответить на собеседовании

Context с тайм-аутом или дедлайном закрывает Done и сообщает, что работу следует прекратить. Горутина должна сама проверять отмену или вызывать функции, поддерживающие context. Несотрудничающий код продолжит работу. Для подтверждения завершения нужны отдельная синхронизация и корректное освобождение ресурсов.

Подробный разбор

Ответ с пояснениями

Да, можно передать срок работы, но context не прерывает горутину принудительно. Он передаёт сигнал об отмене; обработка остаётся обязанностью кода. Это ключевое различие между дедлайном запроса и гарантией остановки произвольного вычисления.

Пример функции, реагирующей на отмену:

func waitForWork(ctx context.Context) error {
    timer := time.NewTimer(5 * time.Second)
    defer timer.Stop()
    select {
    case <-ctx.Done():
        return ctx.Err()
    case <-timer.C:
        return nil
    }
}

Вызывающая сторона создаёт context.WithTimeout, вызывает полученный cancel при выходе и передаёт context функции. Если запускает её в отдельной горутине, результат можно получить через канал или группу ожидания. Сам вызов cancel() не дожидается её завершения.

Операции I/O должны использовать API с поддержкой context или собственными дедлайнами. Для длительных вычислений проверку отмены добавляют между ограниченными шагами. Оборачивание бесконечного или блокирующего вызова в горутину и ожидание ctx.Done() не устраняет оставшуюся горутину.

Нельзя также обещать абсолютно точное время завершения: планирование и очистка занимают время, а если одновременно готовы несколько ветвей select, может быть выбрана любая. Контракт и свойства Done описаны в документации context.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку