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 @   潜行1  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示