我是golang的初學者。限制http的帶寬得到
有什麼辦法可以限制golang的http.Get()帶寬使用率嗎?我發現這個:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不知道如何將兩者拼湊在一起。我將如何訪問http讀取器?
我是golang的初學者。限制http的帶寬得到
有什麼辦法可以限制golang的http.Get()帶寬使用率嗎?我發現這個:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol,但我不知道如何將兩者拼湊在一起。我將如何訪問http讀取器?
的更新版本,通過包裝io.Reader
在這裏使用它是一個完整的例子,它會顯示谷歌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}
}
}
沒什麼魔法。
看起來不錯。怎麼辦檢查是否已達到限制,如5MB?我只使用b:= make([] byte,5000000); wrappedIn.Read(b)中;? – John 2015-01-10 03:01:19
不,你會把'io.Reader'包裝在[io.LimitedReader](http://golang.org/pkg/io/#LimitedReader)中。 – 2015-01-10 13:48:20
這限制了從內核的TCP緩衝區讀取的速度,而不是直接從遠程讀取的速度。本地TCP緩衝區將填滿,當您從緩衝區中讀取(緩慢)時,網絡將處於空閒狀態,然後再次突發重新填充緩衝區。對於大規模的下載,你平均每秒鐘處理10個字節的速度,但是對於一個小的下載,你只是慢慢地使用它,網絡活動沒有任何不同。要限制網絡活動,請參閱https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidth – 2017-11-14 18:25:16