Golang time/rate 限速器

Go 提供了一個package(golang.org/x/time/rate) 用來方便的對速度進行限制,下面就用示例來說明下如何使用。

首先創(chuàng)建一個rate.Limiter,其有兩個參數(shù),第一個參數(shù)為每秒發(fā)生多少次事件,第二個參數(shù)是其緩存最大可存多少個事件。

rate.Limiter提供了三類方法用來限速

  • Wait/WaitN 當沒有可用或足夠的事件時,將阻塞等待 推薦實際程序中使用這個方法
  • Allow/AllowN 當沒有可用或足夠的事件時,返回false
  • Reserve/ReserveN 當沒有可用或足夠的事件時,返回 Reservation,和要等待多久才能獲得足夠的事件。

Wait/WaitN 示例

package main

import (
    "fmt"
    "time"

    "golang.org/x/net/context"
    "golang.org/x/time/rate"
)

func main() {
    l := rate.NewLimiter(20, 5)
    c, _ := context.WithCancel(context.TODO())
    fmt.Println(l.Limit(), l.Burst())
    for {
        l.Wait(c)
        time.Sleep(200 * time.Millisecond)
        fmt.Println(time.Now().Format("2016-01-02 15:04:05.000"))
    }
}

Allow/AllowN 示例

func main() {
    l := rate.NewLimiter(1, 3)
    for {
        if l.AllowN(time.Now(), 2) {
            fmt.Println(time.Now().Format("2016-01-02 15:04:05.000"))
        } else {
            time.Sleep(6     * time.Second)
        }
    }
}

Reserve/ReserveN 示例

func main() {
    l := rate.NewLimiter(1, 3)
    for {
        r := l.ReserveN(time.Now(), 3)
        time.Sleep(r.Delay())
        fmt.Println(time.Now().Format("2016-01-02 15:04:05.000"))
    }
}
Reserve/ReserveN 還有更多其他的用法,需要的就根據(jù)需要查閱文檔吧:)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容