并行下载多个文件? (Linux的/ Python的?)

时间:2013-04-25 15:53:52

标签: python parallel-processing download

我有一个远程文件位置和本地路径的大列表,我希望它们最终到达。每个文件都很小,但其中有很多。我在Python中生成这个列表。

我想在解压缩和处理它们之前尽快(并行)下载所有这些文件。我使用的最佳库或linux命令行实用程序是什么?我尝试使用multiprocessing.pool实现这一点,但这不适用于FTP库。

我查看了pycurl,这似乎是我想要的,但我无法让它在Windows 7 x64上运行。

4 个答案:

答案 0 :(得分:0)

尝试wget,这是一个安装在大多数Linux发行版上的命令行实用程序,也可以通过Windows上的Cygwin获得。

您也可以查看Scrapy,这是一个用Python编写的库/框架。

答案 1 :(得分:0)

我通常使用pscp来执行此类操作,然后使用subprocess.Popen

进行调用

例如:

pscp_command = '''"c:\program files\putty\pscp.exe" -pw <pwd> -p -scp -unsafe <file location on my   linux machine including machine name and login, can use wildcards here> <where you want the files to go on a windows machine>'''
p = subprocess.Popen( pscp_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
stdout, stderr = p.communicate()
p.wait()

当然我假设linux - &gt;窗

答案 2 :(得分:0)

如果您使用multiprocessing模块中的Pool对象,urllib2应该处理FTP。

results = {}
def get_url(url):
    try:
        res = urllib2.urlopen(url)
        # url should start with 'ftp:'
        results[url] = res.read()
    except Exception:
        # add more meaningful exception handling if you need it. Eg, retry once etc. 
        results[url] = None
pool = Pool(processes=num_processes)
result = pool.map_async(get_url, url_list)
pool.close()
pool.join()

当然,产卵过程会产生一些严重的开销。如果您可以使用像twisted

这样的第三方模块,那么非阻塞请求几乎肯定会更快

开销是否是严重问题将取决于每个文件的下载时间和网络延迟的相对大小。

您可以尝试使用python线程而不是进程来实现它,但它有点棘手。请参阅this question的答案,以便在线程中安全地使用urllib2。您还需要使用multiprocessing.pool.ThreadPool而不是常规Pool

答案 3 :(得分:0)

知道它是一个老帖子但是有一个完美的linux实用程序。如果要从远程主机传输文件,lftp非常棒!我主要使用它来快速将东西推送到我的ftp服务器,但它也很适合使用mirror命令来删除东西。它还可以选择按照您的需要并行复制用户定义的文件数。如果要将某些文件从远程路径复制到本地路径,则命令行应如下所示;

lftp
open ftp://user:password@ftp.site.com
cd some/remote/path
lcd some/local/path
mirror --reverse --parallel=2

但是要非常小心这个命令,就像其他镜像命令一样,如果你搞砸了,你就会删除文件。

有关lftp的更多选项或文档,我访问了此网站http://lftp.yar.ru/lftp-man.html