我可以一次下载一个文件,使用:
import urllib.request
urls = ['foo.com/bar.gz', 'foobar.com/barfoo.gz', 'bar.com/foo.gz']
for u in urls:
urllib.request.urlretrieve(u)
我可以尝试这样做:
import subprocess
import os
def parallelized_commandline(command, files, max_processes=2):
processes = set()
for name in files:
processes.add(subprocess.Popen([command, name]))
if len(processes) >= max_processes:
os.wait()
processes.difference_update(
[p for p in processes if p.poll() is not None])
#Check if all the child processes were closed
for p in processes:
if p.poll() is None:
p.wait()
urls = ['http://www.statmt.org/wmt15/training-monolingual-nc-v10/news-commentary-v10.en.gz',
'http://www.statmt.org/wmt15/training-monolingual-nc-v10/news-commentary-v10.cs.gz',
'http://www.statmt.org/wmt15/training-monolingual-nc-v10/news-commentary-v10.de.gz']
parallelized_commandline('wget', urls)
有没有任何方法可以并行化urlretrieve
,而不使用os.system
或subprocess
进行欺骗?
既然我现在必须求助于“作弊”,那么subprocess.Popen
是下载数据的正确方式吗?
当使用上面的parallelized_commandline()
时,它对wget
使用多线程而不是多核,这正常吗?有没有办法让它多核而不是多线程?
可以使用线程池并行下载文件:
您还可以使用
asyncio
在单个线程中同时下载多个文件:其中^{} is defined here 。
相关问题 更多 >
编程相关推荐