Thread-Safe REST API
Thread-xavfsiz REST API
Haqiqiy HTTP serverda bir vaqtning o'zida ko'plab so'rovlar turli goroutinalarda qayta ishlanadi — Go'ning net/http serveri har bir so'rov uchun avtomatik yangi goroutina ochadi. Agar handler'ingiz umumiy holatni (masalan, hisoblagich yoki map) o'zgartirsa, Concurrency Fundamentals kursidagi Mutex naqshi shu yerda ham zarur.
type Counter struct {
mu sync.Mutex
count int
}
func (c *Counter) Handler(w http.ResponseWriter, r *http.Request) {
c.mu.Lock()
c.count++
current := c.count
c.mu.Unlock()
fmt.Fprintf(w, "%d", current)
}Bu — Concurrency Safety darsidagi SafeRateLimiterning aynan bir xil naqshi, endi HTTP handler shaklida: struct o'z holatini (count) sync.Mutex bilan himoyalaydi, va bu himoya HTTP so'rovlar qanchalik parallel kelishidan qat'i nazar ishlaydi.
>_ Exercise
mu sync.Mutex va count int maydonlariga ega Counter struct'ini yozing. Handler(w http.ResponseWriter, r *http.Request) metodini yozing — u qulf ostida countni bittaga oshiradi va yangi qiymatni javobga yozadi. mainda 100 ta goroutina orqali bir vaqtda Handlerga so'rov yuboring (har biri httptest.NewRequest/NewRecorder bilan), barchasi tugashini kuting, so'ngra yakuniy countni chop eting.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
HTTP handler'lar bir vaqtda ko'plab goroutinalarda chaqirilishi mumkin, shuning uchun ular umumiy holatni Concurrency Fundamentals kursidagi Mutex naqshi bilan himoyalashi kerak. Bu — real production API'larning ajralmas qismi.
NEXT UP
HTTP Middleware Pattern
$ go run main.go
Kodingizni ishga tushiring