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 消耗的时间
}

原文网络