正在从“vetur”获取代码操作_长时间运行 io.Reader 和 io.Writer 操作测算进度和估算剩余时间...

f0c60300ca4d5fdf0aa192eba6160994.png

每当我们在使用类似 io.Copy 和 ioutil.ReadAll 的工具时,比如我们正在从 http.Response 主体读入或者上传一个文件,我们会发现这些方法将一直堵塞,直到整个过程完成,哪怕耗时数十分钟甚至是小时——而且我们没有办法来查看进度,以及计算出完成所需剩余时间的估测值。

本文很长,不想深究瞅这里:这篇文章最终导向 progress 包,你可以在自己的项目中自由使用——https://github.com/machinebox/progress

考虑到 io.Reader 和 io.Writer 都是接口,我们可以封装它们并且拦截 Read 和 Write 方法,捕获实际已经通过它们的字节数。通过一些简单的数学计算,我们可以计算出已完成部分所占的比例。再多上一点数学计算,我们甚至可以估测整个过程还剩余多少时间,假设传输流是相对一致的话。

封装 Reader

一个新的 Reader 类型只需要包含另一个 io.Reader , 并且调用它的 Read 方法来获取返回前读到的字节数。为了保证 reader 可以在并发环境中安全使用(在这个例子中至关重要),我们可以使用 atomic.AddInt64 作为安全的计数器。

2a9d43c0e7a7948c61efb3edc7298618.png

试试看你能不在自己写出 Writer 的计数部分,两者很类似。

由于方法 N 返回( 基于 atomic.LoadInt64 的安全调用)读取到的字节数,我们能在任意时刻使用另一个 goroutine 调用它,从而获取当前状况。

获取总共的字节数

为了计算百分比,我们需要知道总数是多少——我们预期读取多少字节?

上传文件时,我们能够利用操作系统获取文件大小。

e7fb3b16ecb3a1aef771eb0a5c7d8b8e.png

在 HTTP 环境中,你可以借助下面这些代码来获取 Content-Length 报头值。

95349e9f0b0dba95d4ca708c9f87e7c8.png

如果 Content-Length 报头是空的(这有可能),那么就无法判断进度或者估计剩余时间。

在其他状况下,你也会需要弄清楚如何获取字节总数。

计算百分比

现在我们可以计算已经被处理的字节数所占百分比:

a620736eee39da6608be3de6781ee435.png

我们需要把值转换为 float64 从而避免早期的向下取整。如果需要整数级精度的话我们依然可以把结果向下取整。

估算剩余时间

有一个非常简单的方法:求出读取 X 字节所需时间,然后乘以剩余的字节数。

举个例子,如果耗时 10 秒完成了 50% 的操作,那么就可以假设仍需要 10 秒来完成整个任务;总耗时 20 秒。

这并不绝对精确,但大多时候都可以给出一个可采用的倒计时。

代码就在下面,但不需要担心你可能理解不了 —— 阅读我们的 package 下面的详细信息可以帮到你。

df47a843e8183b4fdea85b9439e793c1.png
  • ratio — 已经完成字节数所占的百分比
  • past — 从开始到现在的耗时
  • total — 基于已完成的百分比 ratio 和相应耗费的时间,从而得出的预计总耗时
  • estimated — 预测的结束时间点
  • duration — 预测距离完成还需要耗费的时间

浏览 progess 包

2051252e5c6e20a61c33a63b792ed456.png

我们热爱开源,所以我们封装了所有代码到一个 package 中以方便您的使用。

它也支持 io.EOF 和其他你知道的可能会在操作时发生的错误。

小助手

我们还添加了一个小助手,它可以给你一个进度上的 go channel 来周期性报告。 你可以开启一个新的 goroutine 并打印进度,或更新进度,这取决于您的用例。

3ec80044febdac04b7f000e2198fcf13.png

该 channel 会周期性的返回一个 Progress 结构体,该结构体有下列几个方法帮助你了解细节。

  • Percent — 获取操作完成的百分比
  • Estimated — time.Time 表示预期操作结束的时间点
  • Remaining — 一个 time.Duration 变量标识剩余时间

channel 会在几种情况下被关闭,例如操作已完成,或者操作被取消。

点击文档 可以获取 API 的最新详细目录

示例

我们创建了一个 example file downloader 来演示该 package 如何使用。

还有什么?

请尝试我们的开源项目,提出问题,报告议题,提交重要的 PR 。

什么是 Machine Box ?

d84c266338fe618576c63829fb5f30aa.png

Machine Box 把先进的机器学习技术放到 Docker 容器中,以便让开发人员可以更轻松的集成

自然语言处理,面部检测,对象识别等技术到你自己的应用中。

该技术是按比例构建,所以当你的应用扩大时只需要添加更多同级的 box 。噢,而且它比云服务廉价的多(可能还会更好)……而且你的数据也不会离开你自己的基础设备。

玩一玩 , 并且请告知我们您宝贵的意见。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挖掘城市ip_抖in杭州嘉年华,原来城市营销还能这么玩!

作者 | 汤木森来源 | TOP营销(ID:TOP_MKT)在《看不见的城市》中,卡尔维诺曾写下这样的语句:“每到一个新城市,旅行者就会发现一段自己未曾经历的过去。”重庆的穿楼轻轨、西安的摔碗酒、厦门的土耳其冰激凌……这些场景在抖音走红…

搭建微服务_快速搭建 SpringCloud 微服务开发环境的脚手架

本文作者:HelloGitHub-秦人本文适合有 SpringBoot 和 SpringCloud 基础知识的人群,跟着本文可使用和快速搭建 SpringCloud 项目。HelloGitHub 推出的《讲解开源项目》系列,今天给大家带来一款基于 SpringCloud2.1 的微服务开发脚手开源项目—…

getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

文章系列目录(持续更新中):【设计模式】第一篇:概述、耦合、UML、七大原则,详细分析总结(基于Java)【设计模式】第二篇:单例模式的几种实现And反射对其的破坏一 为什么要用工厂模式之前讲解 Spring 的依赖注入的文章时,我们就已经…

gis根据行政区计算栅格数据计算_亚马逊fba运费根据什么计算?怎么计算?

亚马逊FBA一般有如下费用(仅做参考):1、亚马逊头程(本地发货到FBA仓库的费用)2、订单处理费(1USD / Order)3、拣货打包费(1USD / Pcs)4、重量处理费(0.46USD,这个以1磅一下的large standard size非媒介产品为例,这个是以重量等级的不同从而产…

华硕z97不识别m2固态_华硕H110T +i3 8100T 组装黑苹果Mac mini安装教程

最近组装了一台黑苹果主机,从硬件,到系统安装,驱动安装费了很大的精力,写这篇文章记录下来,希望对像我一样需求的网友有用。目前家里是网通200M的宽带,我喜欢挂pt下一些电影,怎么来播放这些电影…

vue封装websocket_有关WebSocket必须了解的知识

一、前言最近之前时间正好在学习java知识,所以自个想找个小项目练练手,由于之前的ssm系统已经跑了也有大半年了,虽然稀烂,但是功能还是勉强做到了,所以这次准备重构ssm系统,改名为postCode系统(至于为什么前…

list选取多个元素 python_【幼儿园级】0基础学python一本通(上)——AI未来系列1...

在未来面前,每个人都是学生江海升月明,天涯共此时,关注江时!引子本篇为AI未来系列第一篇。为什么要研究学习python?python是未来屠龙的屠龙宝刀,再辅助以我们的高中数学基础(足够用的屠龙术),小…

用polt3画曲面_用SolidWorks建模一个:防滑板曲面造型

防滑板曲面造型2020年4月点底部提取码:eo9z此图用SolidWorks2019版建模,用KeyShot 9.0 渲染(上面两张图) 。SW原文件在今日文件夹里。建模过程1.在上视基准面上画草图。2.曲面拉伸,反向:5 。3.新建基准面,距离上视基准…

lntellijidea怎么创建文件_DBC文件到底是个啥

本文首发自公众号“汽车技术馆”在之前的一篇文章中给大家分享了一些CAN的基本知识,比如CAN通讯是个啥,CAN通讯的机制以及CAN通讯的帧结构等等,相信读过这篇文章的朋友应该都有了一个初步的认识,如果还没有看过的朋友可以在读本文…

at moment的用法 the_值得收藏!初中英语10大词类详解+用法+考点, 这一篇全齐了!...

一、词性的分类词类又叫词性,英语单词根据其在句子中的功用,可以分成十个大类。1.名词 noun n. student 学生2.代词 pronoun pron. you 你3.形容词 adjective adj. happy 高兴的4.副词 adverb adv. quickly 迅速地5.动词 verb v. cut 砍、割6.数词 numer…

属性值动态调整_【VBA】Range对象的常用方法属性(三)

本文继续上一节的Range对象的方法和属性的讲解。上一讲讲到了End属性寻找最后一个已经使用的单元格。这一节继续讲解关于动态找单元格区域方面的属性。Offset 偏移相信学过OFFSET工作表函数的人对这个印象比较深刻,它可是函数中高手必备函数之一。在VBA中&#xff0…

mysql入门到跑路_Mysql入门二十小题(DBA老司机带你删库到跑路)2018.11.26

1、 请介绍数据库管理系统的种类及代表产品RDBMS: mysql oracle mssqlNoSQL: redis mongoab memcache2、 请简述数据库管理系统的作用数据存储,管理数据,备份恢复,安全性,权限管理,3、 请简述RDBMS和NoSQL的特性对比RDBMS:强大的查询功能、强一致性、二级索引、支…

mysql安装包没有安装程序_MySQL5.6的zip包安装教程详解

之前我们都是后缀为.msi的文件,换言之就是傻瓜式安装,但是有些版本不容易控制安装路径,或者数据库编码格式,还有些会安装很多无用的服务,但是都没有后缀为.zip文件简单直接,说是在哪里,就在哪里…

mysql count优化_MySQL count()函数及其优化

很简单,就是为了统计记录数由SELECT返回为了理解这个函数,让我们祭出 employee_tbl 表所有记录统计行的总数计算 Zara 的记录数注意:由于 SQL 查询对大小写不敏感,所以在 WHERE 条件中,无论是写成 ZARA 还是 Zara&…

dz论坛连接mysql数据库_dz论坛搬家后连接数据库等教程

dz搬家后,第一步就是上传源文件到网站根目录和导入数据库然后修改对应的数据库连接配置文件 一共有三个这样修改之后网站就可以访问啦1、config/config_global.php$_config[db][1][dbuser] 数据库用户名;$_config[db][1][dbpw] 数据库密码;$_config[db][1][dbname…

php mysql循环语句怎么写_mysql数据库循环语句该怎么写???

数据库结构num date2 2013-07-245 2013-07-258 2013-08-0310 2013-08-224 2013-09-10最后要在页面中输出为一个行行统计格式7月份 7条记录8月份 18条记录9月份 4条记录要求sql语句只有一句话,有的人会想可以select (count(条件))关键是还要换行的。。有点不会了。回…

ntext在mysql_varchar和text说不清的那些事

数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是用定长的,感觉比变长能省些空间&am…

字符串转16进制_16、atoi-整数字符串转整数-leetcode8-中等

思路:借助正则表达式。class Solution:def myAtoi(self, s: str) -> int:import repattern re.compile(r^[-]?d) # 生成patterns s.lstrip() #去除左侧空格num_str pattern.findall(s) #找到pattern,返回一个listnum int(*num_str) #用*将list解…

vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...

由于图片的加载是在dom加载完成之后进行的,于是,在手机端浏览网页时,经常会看到页面刚打开时很多内容叠在一起,当图片加载完成后,页面会由于图片加载完成出现明显的抖动针对这个问题,有以下几种解决方案媒体…

mysql日期为00_MySQL 8.0.13 设置日期为0000-00-00 00:00:00时出现的问题

刚开始学习 数据库 操作,今天存数据时发现,保存的时候报错 (Error 1292: Incorrect datetime value: 0000-00-00 for column deleted_at at row 1),之后就搜索了下原因,是因为 MySQL存日期时不允许出现这种格式导致的。下面记录下…