You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
572 B
32 lines
572 B
package mathutil |
|
|
|
import "time" |
|
|
|
//Limiter speed limiter |
|
type Limiter struct { |
|
Rate float64 // 每秒多少个 |
|
token chan time.Time |
|
timer *time.Ticker |
|
} |
|
|
|
//Token get token |
|
func (l *Limiter) Token() (c <-chan time.Time) { |
|
return l.token |
|
} |
|
|
|
func (l *Limiter) putToken() { |
|
for t := range l.timer.C { |
|
l.token <- t |
|
} |
|
} |
|
|
|
//NewLimiter create new limiter |
|
func NewLimiter(rate float64) *Limiter { |
|
var l = &Limiter{ |
|
Rate: rate, |
|
token: make(chan time.Time, 1), |
|
timer: time.NewTicker(time.Duration(1.0 / rate * float64(time.Second))), |
|
} |
|
go l.putToken() |
|
return l |
|
}
|
|
|