Назад к вопросам
Senior
5
package main import ( "io" "net/http" "strconv" "time" ) // getData returns almost static data, yet, sometimes it changes. func getData() int { time.Sleep(time.Millisecond * 100) return 1 } func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { _, _ = io.WriteString(writer, strconv.Itoa(getData())) }) if err := http.ListenAndServe(":8080", mux); err != nil { panic(err) } }
Компании, где спрашивали
Не указано
Ответ от нейросети
sobes.tech AI
В данном коде HTTP-сервера на Go функция getData() имитирует получение почти статичных данных с небольшой задержкой.
Чтобы улучшить производительность и уменьшить задержки при обработке запросов, можно реализовать кэширование результата getData(), обновляя его асинхронно с некоторым интервалом.
Пример улучшения с использованием горутины и атомарного кэша:
package main
import (
"io"
"net/http"
"strconv"
"sync/atomic"
"time"
)
var cachedData atomic.Value
func refreshData() {
for {
data := getData()
cachedData.Store(data)
time.Sleep(time.Second) // обновлять каждую секунду
}
}
func getData() int {
time.Sleep(time.Millisecond * 100) // имитация задержки
return 1
}
func main() {
cachedData.Store(0) // инициализация
go refreshData()
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data := cachedData.Load().(int)
_, _ = io.WriteString(w, strconv.Itoa(data))
})
if err := http.ListenAndServe(":8080", mux); err != nil {
panic(err)
}
}
Такой подход позволяет:
- Избежать блокировок и задержек в обработке каждого запроса.
- Обновлять данные в фоне с нужной частотой.
- Быстро отдавать кэшированные данные клиентам.
Если данные меняются редко, можно увеличить интервал обновления, чтобы снизить нагрузку.