-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrate_limiter.go
38 lines (32 loc) · 914 Bytes
/
rate_limiter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package throttler
import (
"sync"
"sync/atomic"
"time"
)
// RateLimiter handles rate limiting with atomic operations for thread safety
type RateLimiter struct {
ticker *time.Ticker
interval atomic.Int64 // Stores interval in nanoseconds
mu sync.Mutex // Protects ticker updates
}
// newRateLimiter creates a new rate limiter with the specified interval
func newRateLimiter(interval time.Duration) *RateLimiter {
r := &RateLimiter{}
r.interval.Store(interval.Nanoseconds())
r.ticker = time.NewTicker(interval)
return r
}
// setInterval updates the rate limiter's interval
// interval is the new duration between ticks
func (r *RateLimiter) setInterval(interval time.Duration) {
r.mu.Lock()
defer r.mu.Unlock()
// Store new interval
r.interval.Store(interval.Nanoseconds())
// Safely replace the ticker
if r.ticker != nil {
r.ticker.Stop()
}
r.ticker = time.NewTicker(interval)
}