小编典典

使用Python和线程下载文件

python

我正在创建一个python脚本,该脚本接受到远程文件的路径和n个线程。文件的大小将除以线程数,当每个线程完成时,我希望它们将提取数据附加到本地文件中。

如何管理它,以便将生成的线程的顺序附加到本地文件中,以便字节不被打乱?

另外,如果我要同时下载多个文件怎么办?


阅读 140

收藏
2021-01-20

共1个答案

小编典典

您可以使用锁&c协调工作,但我建议改用Queue-通常是在Python中协调多线程(和多处理)的最佳方法。

我会让主线程生成您认为合适的尽可能多的工作线程(您可能希望通过实验来在性能之间进行校准,并在远程服务器上进行加载);每个工作线程都在同一个全局Queue.Queue实例上等待,workQ例如,为“工作请求”调用它(wr = workQ.get()将正确执行-每个工作请求都是由单个工作线程获得的,不必大惊小怪。

在这种情况下,“工作请求”可以简单地是一个三元组(包含三项的元组):远程文件的标识(URL或其他内容),从中获取数据所需的偏移量,从中获取字节数(请注意,这对于获取一个或多个文件同样有效)。

主线程将所有工作请求推送到workQ(仅workQ.put((url, from, numbytes))针对每个请求),并等待结果到达另一个Queue实例,然后调用它resultQ(每个结果也将是一个三元组:文件标识符,起始偏移量,该文件在该偏移处的结果)。

当每个工作线程都满足其正在执行的请求时,它将结果放入resultQ并返回以获取另一个工作请求(或等待一个)。同时,主线程(或如果需要单独的专用“编写线程”
-也就是说,如果主线程还有其他工作要做,例如在GUI)从得到的结果resultQ和执行的需要openseek以及write运营放置在数据正确的地方。

终止操作有几种方法:例如,一个特殊的工作请求可能会要求接收该操作的线程终止—workQ在所有实际的工作请求之后,主线程所穿的线程与工作线程一样多,然后在接收和写入所有数据后加入所有工作线程(存在许多替代方法,例如直接加入队列,具有工作线程守护程序,以便它们在主线程终止时消失)等等。

2021-01-20