下面是一个使用Python多线程进行HTTP下载的简单示例。在这个示例中,我们将使用`threading`模块来创建多个线程,每个线程都会下载一个文件。为了简化,我们将使用`requests`库来发送HTTP请求,并假设我们下载的文件大小适中,可以直接存储到内存中(对于大文件,应该使用流式传输并写入文件)。
请注意,实际使用中,你可能需要处理网络错误、超时、重定向等情况,并且对于大文件,应该使用流式下载到磁盘,以避免内存溢出。
import threading
import requests
def download_file(url, filename):
"""
使用requests下载文件并保存到本地。
注意:这个示例将文件内容保存在内存中,仅适用于小文件。
"""
response = requests.get(url)
if response.status_code == 200:
# 这里仅作为示例,实际使用中应写入文件
# with open(filename, 'wb') as f:
# f.write(response.content)
print(f"Downloaded {filename} successfully!")
else:
print(f"Failed to download {filename}. Status code: {response.status_code}")
# 定义要下载的文件列表
urls_and_filenames = [
("http://example.com/file1.zip", "file1.zip"),
("http://example.com/file2.zip", "file2.zip"),
# 添加更多URL和文件名对
]
# 创建并启动线程
threads = []
for url, filename in urls_and_filenames:
t = threading.Thread(target=download_file, args=(url, filename))
t.start()
threads.append(t)
# 等待所有线程完成
for t in threads:
t.join()
print("All downloads completed.")
**注意**:
- 我已经注释掉了写入文件的代码,因为在这个示例中我们主要关注多线程的创建和启动。
- 在实际使用中,你应该取消对写入文件代码的注释,并根据需要调整文件路径和文件名。
- 还需要注意的是,多线程下载文件时,如果目标服务器对并发连接数有限制,可能需要添加适当的延迟或限制线程数,以避免被服务器封禁。
- `requests`库不是线程安全的,但对于大多数用途来说,它足够好,因为它在每次请求时都会创建新的连接。然而,如果你正在编写需要极高并发性的应用,可能需要考虑使用更底层的HTTP库,如`httplib`(在Python 3中为`http.client`)或`urllib3`,这些库允许你更细致地控制连接和线程安全。