欢迎访问宙启技术站
智能推送

Python多线程:同时下载多个文件并显示进度条

发布时间:2023-12-04 22:12:27

在Python中,可以使用多线程来同时下载多个文件,并且可以通过使用进度条来显示下载进度。下面是一个使用多线程和进度条来下载多个文件的示例代码:

import requests
from threading import Thread
from tqdm import tqdm

# 定义要下载的文件列表
file_list = [
    'https://example.com/file1.txt',
    'https://example.com/file2.txt',
    'https://example.com/file3.txt'
]

# 定义一个函数,用于下载文件,并显示下载进度条
def download_file(url):
    # 获取文件名
    file_name = url.split('/')[-1]
    # 发送HTTP请求,下载文件
    response = requests.get(url, stream=True)
    
    # 获取文件大小
    total_size = int(response.headers.get('content-length', 0))
    # 初始化进度条
    progress_bar = tqdm(total=total_size, unit='B', unit_scale=True)
    
    # 以二进制的方式写入文件
    with open(file_name, 'wb') as file:
        for data in response.iter_content(chunk_size=4096):
            # 更新进度条
            progress_bar.update(len(data))
            # 写入文件
            file.write(data)
    
    # 关闭进度条
    progress_bar.close()

# 创建多个线程进行文件下载
threads = []
for file_url in file_list:
    t = Thread(target=download_file, args=(file_url,))
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    t.join()

print("All files downloaded.")

上述代码中,首先定义了一个文件列表file_list,包含了要下载的文件的URL地址。然后,使用download_file函数定义了下载文件的逻辑,其中使用了requests库发送HTTP请求,并使用chunk_size参数进行分块下载。我们通过在requests.get函数中添加stream=True参数来启用流式下载。使用tqdm库来创建进度条,并在下载过程中不断更新进度条。

在主线程中,我们创建了多个线程,每个线程都调用download_file函数来下载一个文件。通过调用thread.join()方法,主线程会等待所有的子线程执行完毕后再继续执行。

最后,程序输出"All files downloaded."表示所有文件下载完成。

通过这个例子,我们可以看到多线程和进度条的使用,可以同时下载多个文件并显示下载进度。这对于需要下载大量文件的任务来说,可以大大提高效率,并且提供了一个友好的界面来展示下载进度。