日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時間:2025/3/12 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正在从“vetur”获取代码操作_长时间运行 io.Reader 和 io.Writer 操作测算进度和估算剩余时间... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

每當(dāng)我們在使用類似 io.Copy 和 ioutil.ReadAll 的工具時,比如我們正在從 http.Response 主體讀入或者上傳一個文件,我們會發(fā)現(xiàn)這些方法將一直堵塞,直到整個過程完成,哪怕耗時數(shù)十分鐘甚至是小時——而且我們沒有辦法來查看進度,以及計算出完成所需剩余時間的估測值。

本文很長,不想深究瞅這里:這篇文章最終導(dǎo)向 progress 包,你可以在自己的項目中自由使用——https://github.com/machinebox/progress

考慮到 io.Reader 和 io.Writer 都是接口,我們可以封裝它們并且攔截 Read 和 Write 方法,捕獲實際已經(jīng)通過它們的字節(jié)數(shù)。通過一些簡單的數(shù)學(xué)計算,我們可以計算出已完成部分所占的比例。再多上一點數(shù)學(xué)計算,我們甚至可以估測整個過程還剩余多少時間,假設(shè)傳輸流是相對一致的話。

封裝 Reader

一個新的 Reader 類型只需要包含另一個 io.Reader , 并且調(diào)用它的 Read 方法來獲取返回前讀到的字節(jié)數(shù)。為了保證 reader 可以在并發(fā)環(huán)境中安全使用(在這個例子中至關(guān)重要),我們可以使用 atomic.AddInt64 作為安全的計數(shù)器。

試試看你能不在自己寫出 Writer 的計數(shù)部分,兩者很類似。

由于方法 N 返回( 基于 atomic.LoadInt64 的安全調(diào)用)讀取到的字節(jié)數(shù),我們能在任意時刻使用另一個 goroutine 調(diào)用它,從而獲取當(dāng)前狀況。

獲取總共的字節(jié)數(shù)

為了計算百分比,我們需要知道總數(shù)是多少——我們預(yù)期讀取多少字節(jié)?

上傳文件時,我們能夠利用操作系統(tǒng)獲取文件大小。

在 HTTP 環(huán)境中,你可以借助下面這些代碼來獲取 Content-Length 報頭值。

如果 Content-Length 報頭是空的(這有可能),那么就無法判斷進度或者估計剩余時間。

在其他狀況下,你也會需要弄清楚如何獲取字節(jié)總數(shù)。

計算百分比

現(xiàn)在我們可以計算已經(jīng)被處理的字節(jié)數(shù)所占百分比:

我們需要把值轉(zhuǎn)換為 float64 從而避免早期的向下取整。如果需要整數(shù)級精度的話我們依然可以把結(jié)果向下取整。

估算剩余時間

有一個非常簡單的方法:求出讀取 X 字節(jié)所需時間,然后乘以剩余的字節(jié)數(shù)。

舉個例子,如果耗時 10 秒完成了 50% 的操作,那么就可以假設(shè)仍需要 10 秒來完成整個任務(wù);總耗時 20 秒。

這并不絕對精確,但大多時候都可以給出一個可采用的倒計時。

代碼就在下面,但不需要擔(dān)心你可能理解不了 —— 閱讀我們的 package 下面的詳細(xì)信息可以幫到你。

  • ratio — 已經(jīng)完成字節(jié)數(shù)所占的百分比
  • past — 從開始到現(xiàn)在的耗時
  • total — 基于已完成的百分比 ratio 和相應(yīng)耗費的時間,從而得出的預(yù)計總耗時
  • estimated — 預(yù)測的結(jié)束時間點
  • duration — 預(yù)測距離完成還需要耗費的時間

瀏覽 progess 包

我們熱愛開源,所以我們封裝了所有代碼到一個 package 中以方便您的使用。

它也支持 io.EOF 和其他你知道的可能會在操作時發(fā)生的錯誤。

小助手

我們還添加了一個小助手,它可以給你一個進度上的 go channel 來周期性報告。 你可以開啟一個新的 goroutine 并打印進度,或更新進度,這取決于您的用例。

該 channel 會周期性的返回一個 Progress 結(jié)構(gòu)體,該結(jié)構(gòu)體有下列幾個方法幫助你了解細(xì)節(jié)。

  • Percent?—?獲取操作完成的百分比
  • Estimated?— time.Time 表示預(yù)期操作結(jié)束的時間點
  • Remaining?—?一個 time.Duration 變量標(biāo)識剩余時間

channel 會在幾種情況下被關(guān)閉,例如操作已完成,或者操作被取消。

點擊文檔 可以獲取 API 的最新詳細(xì)目錄

示例

我們創(chuàng)建了一個 example file downloader 來演示該 package 如何使用。

還有什么?

請嘗試我們的開源項目,提出問題,報告議題,提交重要的 PR 。

什么是 Machine Box ?

Machine Box 把先進的機器學(xué)習(xí)技術(shù)放到 Docker 容器中,以便讓開發(fā)人員可以更輕松的集成

自然語言處理,面部檢測,對象識別等技術(shù)到你自己的應(yīng)用中。

該技術(shù)是按比例構(gòu)建,所以當(dāng)你的應(yīng)用擴大時只需要添加更多同級的 box 。噢,而且它比云服務(wù)廉價的多(可能還會更好)……而且你的數(shù)據(jù)也不會離開你自己的基礎(chǔ)設(shè)備。

玩一玩 , 并且請告知我們您寶貴的意見。


總結(jié)

以上是生活随笔為你收集整理的正在从“vetur”获取代码操作_长时间运行 io.Reader 和 io.Writer 操作测算进度和估算剩余时间...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。