package main
import (
"fmt"
"log"
"time"
)
func getToken(interval time.Duration) (chan bool, chan struct{}) { //参数为每这个时间执行一次,qps = 1 / interval (s)
mc := make(chan bool) // 令牌管道
sc := make(chan struct{}) // 外部可以停止
go func() {
defer func() {
close(sc)
}()
for {
select {
case <-sc:
return
default:
time.Sleep(interval)
mc <- true
}
}
}()
return mc, sc
}
func main() {
fmt.Println(time.Now().Unix())
for i := 0; i < 10; i++ {
tokenChan, _ := getToken(500*time.Millisecond)
log.Println(<-tokenChan)
}
}
说明:getToken相当于token生成器,传入1/限流数的时间。定义了2个管道
mc := make(chan bool) // 令牌管道
sc := make(chan struct{}) // 外部可以停止
mc就是每隔多少秒,向管道输入一个令牌,sc是外部可以停止运行该生成器,就是停止mc的管道输入。