Context с тайм-аутом или дедлайном закрывает Done и сообщает, что работу следует прекратить. Горутина должна сама проверять отмену или вызывать функции, поддерживающие context. Несотрудничающий код продолжит работу. Для подтверждения завершения нужны отдельная синхронизация и корректное освобождение ресурсов.
Можно ли ограничить время работы горутины с помощью context в Go?
Тайм-аут сигнализирует об отмене, но не убивает горутину. Сотрудничающая операция, освобождение ресурсов и ожидание завершения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Да, можно передать срок работы, но 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.