限制http get的带宽
Limiting bandwidth of http get
我是 golang 的初学者。
有没有办法限制golang的http.Get()带宽使用?我发现了这个:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不确定如何将两者拼凑在一起。我将如何访问 http Reader?
的更新版本
您可以通过包裹 io.Reader
来使用它
这是一个完整的示例,它将显示 Google veeeery sloooowly 的主页。
这种包装接口以实现新功能的方式是非常好的 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)
}
}
第三方包有方便的包装器。但是,如果您对引擎盖下的工作原理感兴趣 - 这很容易。
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}
}
}
没什么神奇的。
我是 golang 的初学者。
有没有办法限制golang的http.Get()带宽使用?我发现了这个:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不确定如何将两者拼凑在一起。我将如何访问 http Reader?
您可以通过包裹 io.Reader
这是一个完整的示例,它将显示 Google veeeery sloooowly 的主页。
这种包装接口以实现新功能的方式是非常好的 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)
}
}
第三方包有方便的包装器。但是,如果您对引擎盖下的工作原理感兴趣 - 这很容易。
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}
}
}
没什么神奇的。