import (
"golang.org/x/time/rate"
"io"
)
type rateLimitedReader struct {
r io.Reader
limiter *rate.Limiter
}
func (rlr *rateLimitedReader) Read(p []byte) (int, error) {
n, err := rlr.r.Read(p)
if err != nil {
return n, err
}
if n > 0 {
// WaitN 阻塞直到 limiter 允许 n 个事件发生
err = rlr.limiter.WaitN(context.Background(), n)
if err != nil {
return 0, err
}
}
return n, nil
}
// 创建一个速度为 500 KB/s 的限制器
limiter := rate.NewLimiter(rate.Limit(100*1024), int(100*1024)) // 每秒 500 KB
doDownload := func() {
// resp, err := http.DefaultClient.Do(req)
resp, err := client.Do(req)
if err != nil {
log.Debugf("Failed when making HTTP request: %s", err)
} else {
defer resp.Body.Close()
// 包装 resp.Body 以限制下载速度
limitedReader := &rateLimitedReader{
r: resp.Body,
limiter: limiter,
}
if _, err = io.Copy(io.Discard, io.TeeReader(limitedReader, counter)); err != nil {
if !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) {
log.Debugf("Failed when reading HTTP response: %s", err)
}
}
downloadDone <- struct{}{}
}
}
go 下载限速器
原创
©著作权归作者所有:来自51CTO博客作者go工程师的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:ppp名字规范排序算法
下一篇:p2p 点对点互拉带宽 第一版
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章