最近須要用golang作web上傳下載速度限制功能html
百度了老久,在git上找到了一個庫,github.com/juju/ratelimit (但介紹的目標不是它),使用令牌桶算法,功能很是強大。git
不過我有強迫症,只想簡單的實現web上傳下載速度限制功能,不須要太強大的功能,因而本身寫了一個,github
閃亮登場…gitee.com/kzquu/wego 的util/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 消耗的時間 }
原文網絡