Sobes.tech
Back to questions
Senior
4

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) } }

Companies where asked
Не указано

Answer from AI

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)
	}
}

Такой подход позволяет:

  • Избежать блокировок и задержек в обработке каждого запроса.
  • Обновлять данные в фоне с нужной частотой.
  • Быстро отдавать кэшированные данные клиентам.

Если данные меняются редко, можно увеличить интервал обновления, чтобы снизить нагрузку.