使用带有线程的python下载文件

Mar*_*oni 0 python multithreading

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

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

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

Ale*_*lli 9

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

我会让主线程产生你认为合适的工作线程(你可能想要在性能之间进行校准,并通过试验在远程服务器上加载); 每个工作线程在同一个全局Queue.Queue实例上等待,例如,调用它workQ为"工作请求"(wr = workQ.get()将正确地执行 - 每个工作请求由单个工作线程获得,没有大惊小怪,没有muss).

在这种情况下,"工作请求"可以简单地是三元组(具有三个项目的元组):远程文件的标识(URL或其他),从中请求从中获取数据的偏移量,从中获取的字节数(请注意,这对于一个或多个文件提取效果也一样).

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

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

有几种方法可以终止操作:例如,一个特殊的工作请求可能会要求接收它的线程终止 - workQ在所有实际的工作请求之后,主线程和工作线程一样多,然后在接收和写入所有数据时加入所有工作线程(存在许多替代方案,例如直接加入队列,使工作线程守护进程,因此当主线程终止时它们就会消失,等等).