Sobes.tech
Principal

func getCarPrice() int64 { time.Sleep(1 * time.Second) return rand.Int63n(1000) } func main() { http.HandleFunc("/car/instant", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintf(resp, "%d", 0) }) http.ListenAndServe(":8080", nil) }

sobes.tech AI

AIден жооп

Бул коддо, HTTP-сервер дайыма "/car/instant" сурооңузга 0 кайтарат, бирок getCarPrice() функциясы 1 секунд кечиктирүү менен кокустан бааны чыгарат.

Маселе — иштетүүчү getCarPrice() чакырбайт жана дароо 0 менен жооп берет, балким, жипти блоктобош үчүн.

Эгер машинанын актуалдуу баасын кайтаргыңыз келсе, бирок иштетүүчүнү блоктобостон, асинхрон ыкманы колдонсоңуз болот, мисалы, бааны отделдүү goroutineде кэшке сактап, акыркы маанини дароо кайтаруу.

Аркада бааны кэшке сактоо мисалы:

package main

import (
    "fmt"
    "math/rand"
    "net/http"
    "sync/atomic"
    "time"
)

var carPrice int64

func updateCarPrice() {
    for {
        time.Sleep(1 * time.Second)
        price := rand.Int63n(1000)
        atomic.StoreInt64(&carPrice, price)
    }
}

func main() {
    go updateCarPrice()

    http.HandleFunc("/car/instant", func(resp http.ResponseWriter, req *http.Request) {
        price := atomic.LoadInt64(&carPrice)
        fmt.Fprintf(resp, "%d", price)
    })

    http.ListenAndServe(":8080", nil)
}

Бул ыкма менен сервер тезирээк акыркы белгилүү бааны жооп берет, ал фондук жаңыланууда турат.