2015-01-09 76 views

回答

2

還有就是the package on github

的更新版本,通過包裝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) 
    } 
} 
+0

看起來不錯。怎麼辦檢查是否已達到限制,如5MB?我只使用b:= make([] byte,5000000); wrappedIn.Read(b)中;? – John 2015-01-10 03:01:19

+1

不,你會把'io.Reader'包裝在[io.LimitedReader](http://golang.org/pkg/io/#LimitedReader)中。 – 2015-01-10 13:48:20

+0

這限制了從內核的TCP緩衝區讀取的速度,而不是直接從遠程讀取的速度。本地TCP緩衝區將填滿,當您從緩衝區中讀取(緩慢)時,網絡將處於空閒狀態,然後再次突發重新填充緩衝區。對於大規模的下載,你平均每秒鐘處理10個字節的速度,但是對於一個小的下載,你只是慢慢地使用它,網絡活動沒有任何不同。要限制網絡活動,請參閱https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidth – 2017-11-14 18:25:16

11

第三方軟件包有方便的包裝。但如果你對如何在引擎蓋下工作感興趣 - 這很容易。

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} 
    } 
} 

沒什麼魔法。