以下是一个示例代码,展示了如何实现并发下载并在所有下载任务完成后立即结束:
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
def download_file(url):
response = requests.get(url)
if response.status_code == 200:
file_name = url.split('/')[-1]
with open(file_name, 'wb') as f:
f.write(response.content)
print(f"Downloaded {file_name} successfully.")
# 要下载的文件列表
file_urls = [
'http://example.com/file1.txt',
'http://example.com/file2.txt',
'http://example.com/file3.txt'
]
# 设置最大线程数
max_workers = 3
# 创建线程池
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# 提交下载任务
future_to_url = {executor.submit(download_file, url): url for url in file_urls}
# 获取已完成的任务
for future in as_completed(future_to_url):
url = future_to_url[future]
try:
# 获取任务结果
result = future.result()
except Exception as e:
print(f"Failed to download {url}. Exception: {e}")
else:
print(result)
print("All download tasks completed.")
在上面的示例代码中,我们使用了concurrent.futures
模块中的ThreadPoolExecutor
类来创建一个线程池,并设置最大线程数为3。然后,我们使用executor.submit()
方法将下载任务提交给线程池,返回一个Future
对象。将Future
对象和对应的URL保存到future_to_url
字典中,以便后续处理任务结果。
使用as_completed()
函数可以获取已完成的任务,通过遍历future_to_url
字典中的Future
对象,我们可以获取任务的结果(或异常信息)。在本示例中,我们简单地打印了下载成功的文件名。
最后,我们在所有下载任务完成后打印出一条消息,表示所有并发下载任务已经结束。
上一篇:并发消息监听容器的主题分区分布