如何使用 Python 2.7 通过多线程(异步下载)通过 HTTP 下载文件

kmh*_*ain 9 python multithreading http python-2.7

我有一个文件要下载(从 json 中提取的下载路径。例如:)http://testsite/abc.zip

我需要帮助才能执行,所有 5 个线程都应将abc.zip文件下载到输出目录,并且下载必须是Asynchronousconcurrent

目前使用下面的代码,它确实下载了 5 次文件,但它会一一下载(同步)。

我想要的是,同时下载。

def dldr(file=file_url, outputdir=out1):
    local_fn = str(uuid.uuid4())
    if not os.path.exists(outputdir):
        os.makedirs(outputdir)
    s = datetime.now()
    urllib.urlretrieve(file, outputdir + os.sep + local_fn)
    e = datetime.now()
    time_diff = e - s
    logger(out1, local_fn, time_diff)

for i in range(1, 6):
    t = threading.Thread(target=dldr())
    t.start()
Run Code Online (Sandbox Code Playgroud)

我已经阅读了带有多个连接请求帖子,它很有帮助,但没有解决所问问题的要求。

cva*_*tho 9

我将线程模块用于下载线程:
也是请求,但您可以自己将其更改为 urllib。

import threading
import requests

def download(link, filelocation):
    r = requests.get(link, stream=True)
    with open(filelocation, 'wb') as f:
        for chunk in r.iter_content(1024):
            if chunk:
                f.write(chunk)

def createNewDownloadThread(link, filelocation):
    download_thread = threading.Thread(target=download, args=(link,filelocation))
    download_thread.start()

for i in range(0,5):
    file = "C:\\test" + str(i) + ".png"
    print file
    createNewDownloadThread("http://stackoverflow.com/users/flair/2374517.png", file)
Run Code Online (Sandbox Code Playgroud)

  • @GarfieldCat,因为不使用块下载会将整个文件读入内存,这会导致非常大的文件(认为> 1Gb)出现内存问题。对于块,每次仅将“块”读入内存。 (5认同)
  • 为什么我们应该按块下载而不是只下载 f.write(r.content)? (2认同)