【问题标题】:Limiting bandwidth of http get限制http get的带宽
【发布时间】:2015-01-09 21:52:54
【问题描述】:

我是 golang 的初学者。

有没有办法限制 golang 的 http.Get() 带宽使用?我发现了这个:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不确定如何将两者拼凑在一起。如何访问 http 阅读器?

【问题讨论】:

    标签: http go bandwidth-throttling


    【解决方案1】:

    the package on github有更新版本

    您可以通过包装 io.Reader 来使用它

    这是一个完整的例子,它将缓慢地显示谷歌的主页。

    这种包装一个接口来创建新功能是非常好的 Go 风格,你会在你的 Go 之旅中看到很多。

    package main
    
    import (
        "io"
        "log"
        "net/http"
        "os"
    
        "github.com/mxk/go-flowrate/flowrate"
    )
    
    func main() {
        resp, err := http.Get("http://google.com")
        if err != nil {
            log.Fatalf("Get failed: %v", err)
        }
        defer resp.Body.Close()
    
        // Limit to 10 bytes per second
        wrappedIn := flowrate.NewReader(resp.Body, 10)
    
        // Copy to stdout
        _, err = io.Copy(os.Stdout, wrappedIn)
        if err != nil {
            log.Fatalf("Copy failed: %v", err)
        }
    }
    

    【讨论】:

    • 看起来不错。如果已达到 5MB 之类的限制,那么签入怎么办?我可以只使用 b:=make([]byte, 5000000); WrapIn.Read(b);?
    • 不,您会将io.Reader 包装在io.LimitedReader 中。
    • 这限制了您从内核的 TCP 缓冲区读取的速度,而不是直接限制您从远程读取的速度。本地 TCP 缓冲区将填满,当您从缓冲区(缓慢)读取时,网络将处于空闲状态,然后它将再次爆发以重新填充缓冲区。对于大型下载,您平均从远程下载 10 字节/秒,但对于小型下载,您只是在缓慢地消耗它,网络活动没有差异。要限制网络活动,请参阅unix.stackexchange.com/questions/28198/…
    【解决方案2】:

    第三方包有方便的包装器。但是,如果您对事物的底层运作方式感兴趣 - 这很容易。

    package main
    
    import (
        "io"
        "net/http"
        "os"
        "time"
    )
    
    var datachunk int64 = 500       //Bytes
    var timelapse time.Duration = 1 //per seconds
    
    func main() {
        responce, _ := http.Get("http://google.com")
        for range time.Tick(timelapse * time.Second) {
            _, err :=io.CopyN(os.Stdout, responce.Body, datachunk)
            if err!=nil {break}
        }
    }
    

    没什么神奇的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2011-08-09
      相关资源
      最近更新 更多