Перенос в горутину сам по себе не создаст промежуточных результатов: 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 не предоставляет прогресс, честно показывайте состояние ожидания и один финальный результат, не выдумывая промежуточные проценты.