golang 速度限制器ratelimit,web上傳下載速度限制

最近須要用golang作web上傳下載速度限制功能html

百度了老久,在git上找到了一個庫,github.com/juju/ratelimit (但介紹的目標不是它),使用令牌桶算法,功能很是強大。git

不過我有強迫症,只想簡單的實現web上傳下載速度限制功能,不須要太強大的功能,因而本身寫了一個,github

閃亮登場…gitee.com/kzquu/wegoutil/ratelimit, 代碼很是簡單,性能絕對更強悍。golang

這個庫包含在另外一個開源項目中,若是不喜歡這樣,歡迎把她拐走,放到你喜歡的目錄去web

廢話很少,使用例子代碼:算法

package main

import (
    "bytes"
    "fmt"
    "io"
    "time"

    "wego/util/ratelimit"
)

type writer struct {
}

func (w *writer) Write(p []byte) (n int, err error) {
    time.Sleep(time.Second / 5) // 模擬網絡傳輸消耗的時間
    return len(p), nil
}

func main() {
    // 源數據 1000 KB
    // 實驗用的源數據不建議太大,由於io.Copy內部一次copy 32KB,源數據太大致使copy次數過多影響實驗效果
    // 就像原本網速支持每秒10KB,你用ratelimit限制100KB每秒是徹底沒效果的
    src := bytes.NewReader(make([]byte, 1000*1024))
    // 模擬客戶端
    dst := &writer{}

    // new 一個速度限制器,每秒傳輸 100 Kb
    bucket := ratelimit.New(100 * 1024)

    start := time.Now()

    // 大概須要 10s 傳輸完
    //n, err := io.Copy(dst, ratelimit.Reader(src, bucket))
    n, err := io.Copy(ratelimit.Writer(dst, bucket), src)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("Copied %d bytes in %s\n", n, time.Since(start))

    // 輸出:
    // Copied 1024000 bytes in 10.2005835s
    // 多出來的 0.2s 實際上是最後一次 write 消耗的時間
}

原文網絡