golang实现多协程下载文件(支持断点续传)
作者:山与路 发布时间:2024-01-31 23:54:34
标签:golang,多协程,下载
引言
写这篇文章主要是周末休息太无聊,看了看别人代码,发现基本上要么是多协程下载文件要么就只有单协程的断点续传,所以就试了试有进度条的多协程下载文件(支持断点续传)
package main
import (
"fmt"
"io"
"os"
"regexp"
"strconv"
"sync"
"github.com/qianlnk/pgbar"
)
/**
* 需求:
1. 多协程下载文件
2.断点续连
**/
func main() {
//获取要下载文件
DownloadFileName := "./123.zip"
//copy的文件
copyFileName := "./test.zip"
storgeFileName := "./current.txt"
//打开文件
sfile, err := os.Open(DownloadFileName)
if err != nil {
panic(err)
}
defer sfile.Close()
//获取文件大小
info, _ := sfile.Stat()
downloadSize := info.Size()
var scount int64 = 1
if downloadSize%5 == 0 {
scount *= 5
} else {
scount *= 10
}
//分给每个协程的大小
si := downloadSize / scount
fmt.Printf("文件总大小:%v, 分片数:%v,每个分片大小:%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("协程进度条")
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)
//取出所有整数
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
}
//从指定位置开始读
n, err := sfile.ReadAt(b, current*si+total)
if err == io.EOF {
wg.Done()
break
}
//从指定位置开始写
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("下载完成")
}
来源:https://blog.csdn.net/a1309525802/article/details/120814564
0
投稿
猜你喜欢
- 一、前言刚刚学了一些python文件读写的内容,先跑过来整活了。顺便复习一下之前学的东西。import timedoc_local='
- 创建工程时,选择已存在的环境(不要选择虚拟环境,虽然安全,但很慢)添加环境在 anaconda3/bin/python3.6 即 d:/an
- 应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性
- 前言使用Python中的自带库math、自带函数pow和自带库cmath来对数字进行开根号运算方法一使用:math.sqrt(数字)impo
- 在网络上的Pandas教程中,很多都提到了如何使用Pandas将已有的数据(如csv,如hdfs等)直接加载成Pandas数据对象,然后在其
- 应用场景这段代码可以用于修改Excel文件的元数据,例如作者、主题、描述等,通过使用Python和Openpyxl模块,以及wxPython
- 对图像块应用仿射变换,我们将其称为图像扭曲(或者仿射扭曲)。该操作不仅经常应用在计算机图形学中,而且经常出现在计算机视觉算法中。一、仿射变换
- 前言在两种python循环语句的使用中,不仅仅是循环条件达到才能跳出循环体。所以,在对python函数进行阐述之前,先对跳出循环的简单语句块
- CUDA的线程与块GPU从计算逻辑来讲,可以认为是一个高并行度的计算阵列,我们可以想象成一个二维的像围棋棋盘一样的网格,每一个格子都可以执行
- 本文实例讲述了python中Flask框架的简单用法。分享给大家供大家参考。具体如下:使用Flask框架的简单入门范例代码,如果你正学习Fl
- 利用FSO取得BMP,JPG,PNG,GIF文件信息:大小,宽、高尺寸等 ’:::::::::::::::::::::::::::
- 要想从命令行启动mysqld服务器,你应当启动控制台窗口(或“DOS window”)并输入命令:C
- 故障表现一方面 :在阿里云控制台云数据库PolarDB对应的集群管理页面上,在诊断与优化模块里面的一键诊断会话管理中,发现某条update
- Python字符编码目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk。python2默认的字符编码
- 随机生成四位数验证码,包括汉字,数字,英文大小写。1.Servlet类package servlet;import java.awt.Bas
- 用ACCESS数据库开发的网站,当随着网站数据量的不断增长.数据库的容量也是不断加大.这让ASP程序速度直线下降.如果才能让ACCESS数据
- 本文对djangoHTML的表单控件中的单选及多选进行介绍,并说明如何进行参数传递。1.HTML中的表单控件:在HTML中表单的书写一般为:
- 本文实例讲述了Python实现读取及写入csv文件的方法。分享给大家供大家参考,具体如下:新建csvData.csv文件,数据如下:具体代码
- 本文实例讲述了Python抓取某只基金历史净值数据。分享给大家供大家参考,具体如下:http://fund.eastmoney.com/f1
- #! -*- coding:utf-8 -*- import string s = 'Ye