golangはファイルをダウンロードするためにマルチプロセッシングを実装しています(ブレークポイント転送をサポート)。
2022-01-07 08:14:35
紹介
/{br
この記事を書いたのは主に、週末に暇すぎて他の人のコードを見ていたら、基本的にマルチプロセスでファイルをダウンロードするか、シングルプロセスでブレークポイント転送しかしないことがわかったので、マルチプロセスでプログレスバー付きのファイルをダウンロードするようにしてみた(ブレークポイント転送に対応)。
package main
import (
"fmt"
"io"
"os"
"regexp"
"strconv"
"sync"
"github.com/qianlnk/pgbar"
)
/**
* Requirements:
1. multi-processing to download files
2. Breakpoint connection
**/
func main() {
//Get the file to download
DownloadFileName := ". /123.zip"
//copy the file
copyFileName := ". /test.zip"
storgeFileName := ". /current.txt"
//open file
sfile, err := os.Open(DownloadFileName)
if err ! = nil {
panic(err)
}
defer sfile.Close()
//Get the size of the file
info, _ := sfile.Stat()
downloadSize := info.Size()
var scount int64 = 1
if downloadSize%5 == 0 {
scount *= 5
} else {
scount *= 10
}
// the size to be divided to each concurrent process
si := downloadSize / scount
fmt.Printf("Total file size: %v, number of slices: %v, size of each slice: %v\n", downloadSize, scount, si)
//open copy file
copyFile, err := os.OpenFile(copyFileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err ! = nil {
panic(err)
}
storgeFile, err := os.OpenFile(storgeFileName, os.O_CREATE|os.O_RDWR, os.ModePerm)
if err ! = nil {
panic(err)
}
defer copyFile.Close()
var currentIndex int64 = 0
wg := sync.WaitGroup{}
fmt.Println("Sync progress bar")
pgb := pgbar.New("")
for ; currentIndex < scount; currentIndex++ {
wg.Add(1)
go func(current int64) {
p := pgb.NewBar(fmt.Sprint((current+1))+"st", int(si))
// p.SetSpeedSection(900, 100)
b := make([]byte, 1024)
bs := make([]byte, 16)
currentIndex, _ := storgeFile.ReadAt(bs, current*16)
// Retrieve all integers
reg := regexp.MustCompile(\d+`)
countStr := reg.FindString(string(bs[:currentIndex]))
total, _ := strconv.ParseInt(countStr, 10, 0)
progressBar := 1
for {
if total >= si {
wg.Done()
break
}
// Read from the specified location
n, err := sfile.ReadAt(b, current*si+total)
if err == io.EOF {
wg.Done()
break
}
// Write from the specified location
copyFile.WriteAt(b, current*si+total)
storgeFile.WriteAt([]byte(strconv.FormatInt(total, 10)+" "), current*16)
total += int64(n)
if total >= si/10*int64(progressBar) {
progressBar += 1
p.Add(int(si / 10))
}
}
}(currentIndex)
}
wg.Wait()
storgeFile.Close()
os.Remove(storgeFileName)
fmt.Println("Download completed")
}
golangのマルチプロセッシングのダウンロードファイル(サポートブレークポイント)についてのこの記事は、これに導入され、より関連するgolangのマルチプロセッシングのダウンロードファイルの内容は、スクリプトホーム以前の記事を検索するか、次の関連記事を参照してください続けるあなたは、スクリプトホームをよりサポートすることを願っています! この記事で紹介されています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン