-
Notifications
You must be signed in to change notification settings - Fork 3k
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
增加了当下载视频时,多线程分段下载的功能 #629
Conversation
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文件(因此可能需要两倍大小的磁盘容量,回续可能优化) 线程调度方案也可能会优化,以尽量利用可能的线程
2. 规范了函数命名 3. 规范了注释 3. 优化了review中提到的代码,删掉了一些无用的变量
There was a problem hiding this 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
2. errors.new() 改为 fmt.Errorf()
还有点问题,你试着下载一个大一点的视频(我刚刚试了下 https://www.bilibili.com/video/av92745169 这个),当其中一个 part 下载完成而其它未完成的时候,中断再下载就会报错
而且频繁中断下载的话感觉会掉帧,那一秒的画面一部分是模糊的(马赛克那种),原视频是正常的,这个感觉是边界有问题,但是我没看出来 |
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文件重新合并。
已修复。 关于删掉part重新下载以及对异常大小的part的检查。现已改为如果出现异常part则自动删除并重新下载,对用户透明。现在也增加了对丢失part的检查,如果检查到不连续的part(根据 lartEnd与part.Start),则会插入一个新part来补充丢失的部分。 |
我多次中断重新下载后,会出现卡在 100% 不退也不合并的情况
你可以多测一下,感觉哪里还有问题,但是我没看出来 |
真的辛苦了=。= |
还好,毕竟写代码的是你 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
将文件分成指定的thread数量的part文件,每个part
文件记录着在整个文件中的偏移量,以及本part当前已下载的数据大小。恢复下载时,会同意所有part的信息,以支持继续下载。
当重新启动后,part数量与线程数量不同时,有以下两种情况:
下载完成后,合并所有part,然后删除part文件(因此可能需要两倍大小的磁盘容量,回续可能优化)
线程调度方案也可能会优化,以尽量利用可能的线程