最近须要用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 消耗的时间 }
原文网络