美文网首页
go语言实现令牌桶限流

go语言实现令牌桶限流

作者: 天上掉下的胖纸 | 来源:发表于2019-08-11 22:44 被阅读0次

    简单实现令牌桶,复制即可用

    package main
    
    import (
        "fmt"
        "log"
        "time"
    )
    
    var startTime = time.Now()
    
    func main() {
        bucket()
    }
    //令牌桶案例
    func bucket() {
        quantum := int64(1)
        rate := float64(2)
        capacity := int64(2)
        count := int64(1)
        fillInterval := time.Duration(1e9 * float64(quantum) / rate)
        fmt.Printf("fillInterval : %d \n", fillInterval)
        availableTokens := int64(2)
    
        var lastTick int64
    
        t := time.NewTicker(400 * time.Millisecond)
    
        for e := range t.C {
            //当前时间与服务启动时间的差值,除以时间间隔 -> 算出数量
            tick := int64(time.Now().Sub(startTime) / fillInterval)
            if availableTokens >= capacity {
                fmt.Printf("ok use [%d]\n", availableTokens)
            } else {
                //两个相减,算出真正的可用数量
                availableTokens += (tick - lastTick) * quantum
                fmt.Printf("tick - lastTick : %d\n", availableTokens)
                if availableTokens > capacity {
                    availableTokens = capacity
                }
                lastTick = tick
            }
            if availableTokens <= 0 {
                log.Println("no availableTokens")
            } else {
                if count > availableTokens {
                    count = availableTokens
                }
                availableTokens -= count
                fmt.Printf("[%+v], availableTokens has [%d]\n", e, availableTokens)
            }
    
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:go语言实现令牌桶限流

          本文链接:https://www.haomeiwen.com/subject/epsejctx.html