下载管理器:如何重新构建由多个连接提取的块

时间:2010-12-07 16:42:52

标签: python urllib2 connection chunks

所以我正在开发自己的下载管理器用于教育目的。我有多个连接/线程下载文件,每个连接都在文件的特定范围内工作。现在,他们已经取了他们的块,我不知道如何把这些块一起重新制作原始文件。

我做了什么:

首先,我在'wb'模式下创建了一个临时文件,并允许每个连接/线程转储它们的块。但每次连接执行此操作时,它都会覆盖以前保存的块。我想这是因为我使用了'wb'文件描述符。我将其更改为'ab',但我无法执行seek()操作

我在寻找:

我需要一种优雅的方法将这个块重新打包到原始文件中。我想知道其他下载经理是如何做到的。

提前感谢。

2 个答案:

答案 0 :(得分:2)

您需要将不同的临时文件写入块,然后按原始顺序加入它们。如果为所有线程打开一个文件,则应该按顺序访问它以保持正确的数据顺序,这会丢弃线程使用,因为线程应该等待前一个线程。顺便说一下,你应该以{{1​​}}模式打开文件。

答案 1 :(得分:1)

你做得很好:seek()write()。这应该有效!

现在,如果你想要一个更干净的结构,没有那么多线程在整个文件中移动他们的手,你可能想要考虑有下载程序线程和磁盘写入线程。最后一个可能只是睡觉,直到被其他人吵醒,写一些kb到磁盘,然后再回去睡觉。