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)
}
}
Nguồn
2015-01-10 00:43:07
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
Không, bạn sẽ bao bọc 'io.Reader' trong [io.LimitedReader] (http://golang.org/pkg/io/#LimitedReader). –
Đ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 –