GoDasturchi
Concurrency Safety

Concurrency Safety

Concurrency xavfsizligi

Haqiqiy serverda ko'plab so'rovlar bir vaqtda, turli goroutinalarda Allowni chaqiradi. Concurrency Fundamentals kursidagi Race Detection darsida ko'rganingizdek, bir nechta goroutina sinxronlashsiz bitta map'ni bir vaqtda o'qib-yozsa, bu data race — natija buzilishi yoki dastur hatto qulashi mumkin.

Yechim — o'sha kursdagi Mutex naqshi: butun Allow metodini sync.Mutex bilan himoyalash, shunda bir vaqtning o'zida faqat bitta goroutina hisoblagichni o'qiydi va o'zgartiradi.

example.go
type SafeRateLimiter struct {
    mu     sync.Mutex
    limit  int
    counts map[string]int
}

func (l *SafeRateLimiter) Allow(id string) bool {
    l.mu.Lock()
    defer l.mu.Unlock()
    // ... Allow or Deny darsidagi mantiq shu yerda ...
}

>_ Exercise

mu sync.Mutex, limit int va counts map[string]int maydonlariga ega SafeRateLimiter struct'ini va NewSafeRateLimiter(limit int) *SafeRateLimiter konstruktorini yozing. Allow(id string) bool metodini yozing — u avval l.mu.Lock() va defer l.mu.Unlock() qiladi, so'ngra Allow or Deny darsidagi kabi tekshirib, hisoblagichni oshiradi.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

sync.Mutex bilan himoyalangan Allow metodi — production rate limiter'larning yakuniy, ishlab chiqarishga tayyor shakli: bir nechta goroutina bir vaqtda murojaat qilsa ham, hisoblagich har doim izchil (consistent) va aniq qoladi.

Finish
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Concurrency Safety

Concurrency xavfsizligi

Haqiqiy serverda ko'plab so'rovlar bir vaqtda, turli goroutinalarda Allowni chaqiradi. Concurrency Fundamentals kursidagi Race Detection darsida ko'rganingizdek, bir nechta goroutina sinxronlashsiz bitta map'ni bir vaqtda o'qib-yozsa, bu data race — natija buzilishi yoki dastur hatto qulashi mumkin.

Yechim — o'sha kursdagi Mutex naqshi: butun Allow metodini sync.Mutex bilan himoyalash, shunda bir vaqtning o'zida faqat bitta goroutina hisoblagichni o'qiydi va o'zgartiradi.

example.go
type SafeRateLimiter struct {
    mu     sync.Mutex
    limit  int
    counts map[string]int
}

func (l *SafeRateLimiter) Allow(id string) bool {
    l.mu.Lock()
    defer l.mu.Unlock()
    // ... Allow or Deny darsidagi mantiq shu yerda ...
}

>_ Exercise

mu sync.Mutex, limit int va counts map[string]int maydonlariga ega SafeRateLimiter struct'ini va NewSafeRateLimiter(limit int) *SafeRateLimiter konstruktorini yozing. Allow(id string) bool metodini yozing — u avval l.mu.Lock() va defer l.mu.Unlock() qiladi, so'ngra Allow or Deny darsidagi kabi tekshirib, hisoblagichni oshiradi.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

sync.Mutex bilan himoyalangan Allow metodi — production rate limiter'larning yakuniy, ishlab chiqarishga tayyor shakli: bir nechta goroutina bir vaqtda murojaat qilsa ham, hisoblagich har doim izchil (consistent) va aniq qoladi.