go对io操作进行限流
起因是我对大文件进行切片的时候, 先去获取了文件的MD5, 读取文件的过程中把我所有的磁盘io吃满了, 卡的要死, 然后就突然想到了对io进行限流;
因为我现在做的需求以后是有可能放在后台运行的.
使用的一个三方库, 可以对诸如 io.Reader和io.Writer进行限流;
go get github.com/juju/ratelimit
基于令牌桶实现
对原本的 io.Reader包装一层即可;
代码demo:
计算一个文件的md5, 但是限流io速率为 50mb/s
// Md5File return the md5 value of file.func Md5File(filename string) (string, error) {
if fileInfo, err := os.Stat(filename); err != nil {
return "", err
} else if fileInfo.IsDir() {
return "", nil
}
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()
hash := md5.New()
chunkSize := 65536
bucket := ratelimit.NewBucketWithRate(50<<20, 50<<20) // 创建令牌桶
for buf, reader := make([]byte, chunkSize), bufio.NewReader(file); ; {
reader := ratelimit.Reader(reader, bucket)
n, err := reader.Read(buf)
if err != nil {
if err == io.EOF {
break
}
return "", err
}
hash.Write(buf[:n])
}
checksum := fmt.Sprintf("%x", hash.Sum(nil))
return checksum, nil
}
标签:return,file,err,限流,io,go,操作
From: https://www.cnblogs.com/runninginsilence/p/17981421