首页 > 其他分享 >go对I/O操作进行限流

go对I/O操作进行限流

时间:2024-01-22 23:55:36浏览次数:33  
标签:return file err 限流 io go 操作

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

相关文章

  • R语言Pearson相关性分析降雨量和“外卖”谷歌搜索热度google trend时间序列数据可视化
    全文链接:http://tecdat.cn/?p=31608原文出处:拓端数据部落公众号GoogleTrends,即谷歌趋势。谷歌趋势是谷歌旗下一款基于搜索数据推出的一款分析工具。它通过分析谷歌搜索引擎每天数十亿的搜索数据,告诉用户某一关键词或者话题各个时期下在谷歌搜索引擎中展示的频率及其相关统计数......
  • 操作系统学习
    操作系统是什么是一种软件,提供给用户和其他上层软件方便的接口和环境!!!系统资源的管理者提供处理机(CPU)、存储器、文件、设备管理打开QQ--相关数据放入内存--进程被CPU处理--视频通话(摄像头设备)向上层提供方便易用的服务GUI(图形用户接口)比如window下拖拽......
  • Go在Gin中解决CORS中间件没生效的问题
    起因最近在写前后端分离项目,然后在前端访问后端提供的接口时,会出现CORS问题。查找资料发现,Gin官方是有提供中间件的https://github.com/gin-contrib/cors先在terminal输入gogetgithub.com/gin-contrib/cors然后就按照官方的使用例子就行:packagemainimport("time"......
  • 详解img should be PIL Image. Got <class ‘numpy.ndarray‘>
    详解imgshouldbePILImage.Got当使用Python中的PIL(PythonImagingLibrary)库进行图像处理时,有时会遇到如下错误提示:imgshouldbePILImage.Got<class'numpy.ndarray'>。本文将解释该错误的原因和解决方法。问题描述在使用PIL库对图像进行处理时,如果将一个numpy.ndarray类......
  • 收到请求数据的常用安全验证方案,go语言,gin框架
    收到请求数据的常用安全验证方案,go语言,gin框架原创 小锟哥哥 GoLang全栈 2024-01-1807:47 发表于四川 1人听过在使用Gin框架处理前端请求数据时,必须关注安全性问题,以防范常见的攻击。本文将探讨Gin框架中常见的安全问题,并提供相应的处理方法,以确保应用程序的稳......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head......
  • 一文读懂JavaScript DOM节点操作(JavaScript DOM节点操作详解)
    一、什么是节点DOM模型是树状结构模型,二组成这棵树的就是一个个点,在网络术语中称之为节点。节点是一个模型中最基本的组成单位。DOM模型是由一个个节点组成的,DOM节点也有其不同的类型。二、节点类型DOM节点分为5种类型:文档节点(就是整个HTML文档,也就是document对象)元素节点......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>输......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head>......