2015-01-09 16 views

Trả lời

2

Có một phiên bản cập nhật của the package on github

Bạn sử dụng nó bằng cách quấn một io.Reader

Đây là một ví dụ hoàn chỉnh mà sẽ hiển thị trang chủ của Google veeeery sloooowly.

Việc gói giao diện này để tạo chức năng mới là kiểu Go rất tốt và bạn sẽ thấy rất nhiều tính năng trong hành trình của mình vào 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

Có vẻ tuyệt vời. Điều gì về checkin nếu một giới hạn đã đạt được như 5MB? Tôi sẽ chỉ sử dụng b: = make ([] byte, 5000000); wrapIn.Read (b) ;? – John

+1

Không, bạn sẽ bao bọc 'io.Reader' trong [io.LimitedReader] (http://golang.org/pkg/io/#LimitedReader). –

+0

Điều này giới hạn tốc độ mà bạn đọc từ bộ đệm TCP của hạt nhân, không trực tiếp tốc độ mà bạn đọc từ xa. Bộ đệm TCP cục bộ sẽ lấp đầy, mạng sẽ không hoạt động trong khi bạn đọc (từ từ) từ bộ đệm, sau đó nó sẽ phát lại để nạp bộ đệm. Đối với một tải xuống lớn, bạn đang tính trung bình 10 byte/giây từ xa, nhưng đối với một tải xuống nhỏ, bạn chỉ cần tiêu thụ nó chậm, không có sự khác biệt trong hoạt động mạng. Để giới hạn hoạt động mạng, hãy xem https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidth –

11

Gói bên thứ ba có trình bao bọc tiện lợi. Nhưng nếu bạn quan tâm đến cách mọi thứ hoạt động dưới mui xe - nó khá dễ dàng.

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

Không có gì kỳ diệu.

Các vấn đề liên quan