私はゴランの初心者です。httpの帯域幅を制限する
golangのhttp.Get()帯域幅使用を制限する方法はありますか?私はこれを見つけました:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol、しかし私は一緒に2つを作る方法がわかりません。どうすればhttpリーダーにアクセスできますか?
私はゴランの初心者です。httpの帯域幅を制限する
golangのhttp.Get()帯域幅使用を制限する方法はありますか?私はこれを見つけました:http://godoc.org/code.google.com/p/mxk/go1/flowcontrol、しかし私は一緒に2つを作る方法がわかりません。どうすればhttpリーダーにアクセスできますか?
あなたがここにio.Reader
をラップすることにより、それを使用the package on github
の更新バージョンがありますがsloooowlyの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)
}
}
サードパーティ製のパッケージには、便利なラッパーを持っています。しかし、フードの中で物事がどのように機能するかに興味があれば、それは非常に簡単です。
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
あなたは[io.LimitedReader](http://golang.org/pkg/io/#LimitedReader)に 'io.Reader'をラップしません。 –
これは、カーネルのTCPバッファから読み取る速度を制限します。リモートから読み取る速度に直接影響するわけではありません。ローカルTCPバッファがいっぱいになると、ネットワークがアイドル状態になり、バッファから(ゆっくりと)読み込み、次にバッファを再充填するためにバーストします。大規模ダウンロードの場合は、リモートから平均10バイト/秒ですが、ダウンロードが少ない場合は、ネットワークアクティビティに差はなく、ゆっくりと消費します。ネットの活動を制限するには、https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidthを参照してください。 –