限制http的带宽

Joh*_*ohn 5 http go bandwidth-throttling

我是golang的初学者.

有没有办法限制golang的http.Get()带宽使用?我找到了这个:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不知道如何将两者拼凑在一起.我怎样才能访问http阅读器?

Uve*_*tel 13

第三方包具有方便的包装.但是如果你对引擎的工作方式感兴趣 - 这很容易.

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}
    }
}
Run Code Online (Sandbox Code Playgroud)

没什么了不起的.


Nic*_*ood 5

github上有更新版本的包

您通过包装一个来使用它 io.Reader

这是一个完整的示例,它将缓慢显示 Google veeeery 的主页。

这种包装界面以创建新功能是非常好的 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这限制了您从内核的 TCP 缓冲区读取的速度,而不是直接限制您从远程读取的速度。本地 TCP 缓冲区将填满,当您从缓冲区读取(缓慢)时网络将处于空闲状态,然后它会再次爆发以重新填充缓冲区。对于大型下载,您平均从远程下载 10 字节/秒,但对于小型下载,您只是在缓慢地使用它,网络活动没有差异。要限制网络活动,请参阅 https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidth (2认同)