Создание прогрессивного обновления результатов длительной операции

Перенос в горутину сам по себе не создаст промежуточных результатов: ComputeHeavy сейчас возвращает только одно число. Для настоящего прогресса нужен поток событий от самой операции.

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

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

Перенос в горутину сам по себе не создаст промежуточных результатов: ComputeHeavy сейчас возвращает только одно число. Для настоящего прогресса нужен поток событий от самой операции.

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

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

Условие

Необходимо изменить существующий веб‑сервис, чтобы длительная операция выполнялась в отдельном потоке и не блокировала основной процесс сервера. При этом клиенту следует отправлять актуальные данные по мере их появления, а не ждать завершения всей задачи.

Требования:

  • Перевести выполнение длительной функции в асинхронный режим.
  • Обеспечить постепенную отправку клиенту самых свежих результатов.
  • Гарантировать, что основной поток сервера остаётся свободным для обработки новых запросов.

Пример исходного кода (можно переименовать переменные, но логика остаётся той же):

func ComputeHeavy() int {
    res := externalCall()
    // process res
    return res
}

func main() {
    // initialize server
    
    handler := func(w http.ResponseWriter, r *http.Request) {
        // write response
    }
    http.HandleFunc("/", handler)
    
    // run server
}

Ответ

Перенос в горутину сам по себе не создаст промежуточных результатов: ComputeHeavy сейчас возвращает только одно число. Для настоящего прогресса нужен поток событий от самой операции.

В Go HTTP-обработчики уже обслуживаются конкурентно; проблема — ограничение ресурсов и доставка данных. Измените контракт на ComputeHeavy(ctx context.Context, emit func(Result) error) error, чтобы операция сообщала готовые части. Обработчик сериализует события в SSE и делает Flush; ResponseWriter использует только одна горутина. Нужны отмена по r.Context(), ограниченная очередь, обработка отключения клиента и лимит тяжёлых задач. Если externalCall не предоставляет прогресс, честно показывайте состояние ожидания и один финальный результат, не выдумывая промежуточные проценты.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее