package main import ( "fmt" "time" ) func main() { requests := make(chan int, 5) for i := 1; i <= 2; i++ { requests <- i } close(requests) limiter := time.Tick(time.Millisecond * 200) for req := range requests { //會循環兩次,前面往requests channel中發送了兩個值 <-limiter //執行到這里,需要隔 200毫秒才繼續往下執行,time.Tick(timer)上面已定義 fmt.Println("request", req, time.Now()) } burstyLimiter := make(chan time.Time, 3) for i := 0; i < 3; i++ { burstyLimiter <- time.Now() //這里burstyLimiter channel 連續發送了三次值 } go func() { for t := range time.Tick(time.Second * 2) { burstyLimiter <- t // 這里往burstyLimiter channel 循環發送time.Tick } }() burstyRequests := make(chan int, 5) for i := 1; i <= 5; i++ { burstyRequests <- i <-burstyLimiter //前三次沒有速度限制,會直接打印出后面的println的內容 fmt.Println("request", i, time.Now()) } close(burstyRequests) for req := range burstyRequests { <-burstyLimiter //繼續接收burstyLimiter值,除了前三次,后面的都是time.Tick進行速度限制,2秒打印一次,直到此次循環結束 fmt.Println("request", req, time.Now()) } }
注,把time.Tick(time.Second)中的值改為秒會更容易查看效果