go对I/O操作进行限流

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  
}
posted @ 2024-01-22 23:44  潜行1  阅读(46)  评论(0)    收藏  举报