golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后繼續執行


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)中的值改為秒會更容易查看效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM