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 սերվերը միշտ վերադարձնում է 0 "/car/instant" հարցումի համար, չնայած getCarPrice() ֆունկցիան սերնդում է պատահական գին 1 վայրկյան ուշացումով:
Խնդիրը այն է, որ handler-ը չի կանչում getCarPrice(), այլ անմիջապես պատասխան է տալիս 0, հնարավոր է՝ որպեսզի չխոչընդոտի հոսքը:
Եթե ցանկանում եք վերադարձնել իրական մեքենայի գինը, բայց առանց handler-ը խոչընդոտելու, կարող եք օգտագործել ասինխրոն մոտեցում, օրինակ՝ գինը պահել cache-ում առանձին goroutine-ում և անմիջապես վերադարձնել վերջին արժեքը:
Օրինակ՝ գնի cache-ավորումը ֆոնին:
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)
}
Այս կերպ, սերվերը արագ պատասխան է տալիս վերջին հայտնի գինին, որը թարմացվում է ֆոնում։