下载管理器:如何重组通过多个连接获取的分块
我正在开发一个自己的下载管理器,主要是为了学习。我的下载管理器可以同时通过多个连接/线程来下载一个文件,每个连接负责下载文件的某一部分。现在,当它们都下载完自己的那部分后,我不太清楚怎么把这些部分合并成原来的文件。
我做了什么:
首先,我创建了一个临时文件,使用的是“wb”模式,这样每个连接/线程就可以把它们下载的部分写入这个文件。但是每次一个连接写入时,都会覆盖之前保存的部分。我发现这是因为我用了“wb”这个模式。我把它改成了“ab”,但是这样我就不能再进行seek()操作了。
我想要的是什么:
我需要一个优雅的方法来把这些部分重新组合成原来的文件。我想知道其他下载管理器是怎么做到的。
提前谢谢你。
2 个回答
2
你需要把数据分成小块,写到不同的临时文件里,然后再按照原来的顺序把它们合并起来。如果你让所有的线程都去打开同一个文件,那么为了保持数据的正确顺序,你就得让它们一个接一个地访问这个文件,这样就失去了使用线程的意义,因为一个线程得等前一个线程完成才能继续。顺便说一下,你应该以 wb
模式打开文件。
1
你之前做得很好:seek()
和 write()
这两个函数应该是可以正常工作的!
不过,如果你想让结构更清晰,不想让太多线程同时在文件上忙碌,你可以考虑设置一些专门的下载线程和一个负责写入磁盘的线程。这个写入线程可以先休眠,等其他线程把数据准备好后再醒来,写一些数据到磁盘,然后再继续休眠。