Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加了当下载视频时,多线程分段下载的功能 #629

Merged
merged 12 commits into from
Mar 1, 2020

Conversation

M1178475702
Copy link
Contributor

  1. 使用-m 参数启用多线程下载,线程数量由-n决定
  2. 代码上是增加Save的可选版本MultiThreadSave版本。与进度条兼容。
  3. MultiThreadSave的实现:
    将文件分成指定的thread数量的part文件,每个part
    文件记录着在整个文件中的偏移量,以及本part当前已下载的数据大小。恢复下载时,会同意所有part的信息,以支持继续下载。
    当重新启动后,part数量与线程数量不同时,有以下两种情况:
    1. 线程数量小于现存part数,则按线程池调度去完成所有part(使用信号量控制)
    2. 线程数大于现存part数,则多于的线程不启用。
      下载完成后,合并所有part,然后删除part文件(因此可能需要两倍大小的磁盘容量,回续可能优化)
      线程调度方案也可能会优化,以尽量利用可能的线程

1. 使用-m 参数启用多线程下载,线程数量由-n决定
2. 代码上是增加Save的可选版本MultiThreadSave版本。与进度条兼容。
3. MultiThreadSave的实现:
   将文件分成指定的thread数量的part文件,每个part
文件记录着在整个文件中的偏移量,以及本part当前已下载的数据大小。恢复下载时,会同意所有part的信息,以支持继续下载。
当重新启动后,part数量与线程数量不同时,有以下两种情况:
   1. 线程数量小于现存part数,则按线程池调度去完成所有part(使用信号量控制)
   2. 线程数大于现存part数,则多于的线程不启用。
 下载完成后,合并所有part,然后删除part文件(因此可能需要两倍大小的磁盘容量,回续可能优化)
 线程调度方案也可能会优化,以尽量利用可能的线程
1. 使用-m 参数启用多线程下载,线程数量由-n决定
2. 代码上是增加Save的可选版本MultiThreadSave版本。与进度条兼容。
3. MultiThreadSave的实现:
   将文件分成指定的thread数量的part文件,每个part
文件记录着在整个文件中的偏移量,以及本part当前已下载的数据大小。恢复下载时,会同意所有part的信息,以支持继续下载。
当重新启动后,part数量与线程数量不同时,有以下两种情况:
   1. 线程数量小于现存part数,则按线程池调度去完成所有part(使用信号量控制)
   2. 线程数大于现存part数,则多于的线程不启用。
 下载完成后,合并所有part,然后删除part文件(因此可能需要两倍大小的磁盘容量,回续可能优化)
 线程调度方案也可能会优化,以尽量利用可能的线程
@M1178475702
Copy link
Contributor Author

M1178475702 commented Feb 24, 2020

travie构建时报了这个错
image

github.com/iawia002/annie/extractors/youtube

extractors/youtube/youtube.go:171:27: videoInfo.GetDownloadURL undefined (type *ytdl.VideoInfo has no field or method GetDownloadURL)
但是我并没有更改过相关文件,此外本地也可以正常build

@M1178475702
Copy link
Contributor Author

关于多线程的效果:
正常模式:
image
10个线程:
image

@M1178475702 M1178475702 requested a review from iawia002 February 25, 2020 07:10
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
2. 规范了函数命名
3. 规范了注释
3. 优化了review中提到的代码,删掉了一些无用的变量
@M1178475702 M1178475702 requested a review from iawia002 February 26, 2020 18:14
@M1178475702
Copy link
Contributor Author

我觉得这个build问题不是我的代码问题啊=。=都没有用到
image

@iawia002
Copy link
Owner

我觉得这个build问题不是我的代码问题啊=。=都没有用到
image

先不管这个吧,这是其它的单元测试

@M1178475702
Copy link
Contributor Author

我觉得这个build问题不是我的代码问题啊=。=都没有用到
image

先不管这个吧,这是其它的单元测试

麻烦检查下代码吧。。没问题的话可以pull request了吧=。=

utils/utils.go Outdated Show resolved Hide resolved
Copy link
Owner

@iawia002 iawia002 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay
还有一点点 comments

downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Outdated Show resolved Hide resolved
downloader/downloader.go Show resolved Hide resolved
2. errors.new() 改为 fmt.Errorf()
@iawia002
Copy link
Owner

iawia002 commented Mar 1, 2020

还有点问题,你试着下载一个大一点的视频(我刚刚试了下 https://www.bilibili.com/video/av92745169 这个),当其中一个 part 下载完成而其它未完成的时候,中断再下载就会报错 Part0.000000 saved size greater than the size of this part, please delete the part and re-download,这个为啥会报错,而且如果我删了那个 part 重新下载的话,进度条(90% 就退出了)和最后的文件都完全不对

 225.11 MiB / 250.13 MiB [=================================================================================================================================================>----------------]  90.00% 28.16 MiB/s 7s

而且频繁中断下载的话感觉会掉帧,那一秒的画面一部分是模糊的(马赛克那种),原视频是正常的,这个感觉是边界有问题,但是我没看出来

2. 删掉了mustReadFile,合并到parseFilePartMeta
3. 仅在part文件为新创建时向文件写part meta。(因为文件打开模式为append,所以后续的writeFilePart
Meta都会变成追加,倒是文件数据出错)。因此,part.Cur字段只在运行时有效。从part文件中读出的Cur并不代表实际的Cur。实际的Cur由part的文件大小 - part.Start来确定。
4. 增加对缺失part文件的检查。
当恢复下载检测到有part丢失时(part.End - lastEnd != 1),则认定part丢失,在中间插入新part。
5. 增加对合并时中断下载的检查。恢复下载时如果存在.download但是.download文件大小不等于实际文件大小,则删掉.download文件重新合并。
@M1178475702
Copy link
Contributor Author

还有点问题,你试着下载一个大一点的视频(我刚刚试了下 https://www.bilibili.com/video/av92745169 这个),当其中一个 part 下载完成而其它未完成的时候,中断再下载就会报错 Part0.000000 saved size greater than the size of this part, please delete the part and re-download,这个为啥会报错,而且如果我删了那个 part 重新下载的话,进度条(90% 就退出了)和最后的文件都完全不对

 225.11 MiB / 250.13 MiB [=================================================================================================================================================>----------------]  90.00% 28.16 MiB/s 7s

而且频繁中断下载的话感觉会掉帧,那一秒的画面一部分是模糊的(马赛克那种),原视频是正常的,这个感觉是边界有问题,但是我没看出来

已修复。
原因是对检查part文件下载完成时的检测不对。应该是 cur - end == 1,而不是cur == end。
此外,由于原来恢复下载时,总会在O_APPEND模式下重写文件的part meta。但由于是append模式,所以总是变成了追加。现已改为仅在创建新文件时写part meta。

关于删掉part重新下载以及对异常大小的part的检查。现已改为如果出现异常part则自动删除并重新下载,对用户透明。现在也增加了对丢失part的检查,如果检查到不连续的part(根据 lartEnd与part.Start),则会插入一个新part来补充丢失的部分。

downloader/downloader.go Outdated Show resolved Hide resolved
@iawia002
Copy link
Owner

iawia002 commented Mar 1, 2020

我多次中断重新下载后,会出现卡在 100% 不退也不合并的情况

 250.13 MiB / 250.13 MiB [==========================================================================================] 100.00% 25.98 MiB/s
 250.13 MiB / 250.13 MiB [==========================================================================================] 100.00% 12.99 MiB/s
 250.13 MiB / 250.13 MiB [===========================================================================================] 100.00% 8.63 MiB/s
 250.13 MiB / 250.13 MiB [===========================================================================================] 100.00% 6.41 MiB/s
 250.13 MiB / 250.13 MiB [===========================================================================================] 100.00% 4.84 MiB/s
 250.13 MiB / 250.13 MiB [===========================================================================================] 100.00% 4.73 MiB/s

你可以多测一下,感觉哪里还有问题,但是我没看出来

@M1178475702
Copy link
Contributor Author

真的辛苦了=。=

@iawia002
Copy link
Owner

iawia002 commented Mar 1, 2020

真的辛苦了=。=

还好,毕竟写代码的是你

Copy link
Owner

@iawia002 iawia002 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@iawia002 iawia002 merged commit 27a9baa into iawia002:master Mar 1, 2020
@gabriel254
Copy link

#657

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants