《并发之美:用 ThreadPoolExecutor 高效下载网页内容》
一、引言:并发编程的现实意义
在现代软件开发中,性能不再只是硬件的责任。尤其在网络请求、文件处理、数据抓取等 I/O 密集型任务中,合理利用并发机制可以显著提升程序效率。Python 虽然因 GIL(全局解释器锁)在多线程计算密集型任务中存在限制,但在 I/O 密集型场景下,concurrent.futures.ThreadPoolExecutor 却是一把锋利的工具。
本文将通过一个实战案例——并发下载网页内容,深入讲解 ThreadPoolExecutor 的使用方法、map 与 submit 的区别、适用场景及最佳实践。
二、认识 ThreadPoolExecutor:并发的“胶水”
ThreadPoolExecutor 是 Python 3.2 引入的 concurrent.futures 模块中的一部分,它封装了线程池的创建与管理,提供了简洁的 API 来执行并发任务。
相比传统的 threading.Thread,它具有以下优势:
- 自动管理线程池,无需手动启动和 join。
- 提供
map和submit等高级接口,简化任务调度。 - 支持
Future对象,便于获取任务结果与异常处理。
三、实战案例:并发下载网页内容
我们将构建一个小型爬虫,目标是并发地下载一组网页内容,并统计每个页面的字节数。
1. 准备工作
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
URLS = [
'https://www.python.org',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.wikipedia.org',
'https://www.microsoft.com',
'https://www.google.com',
]
2. 使用 map 方法:简洁但不灵活
def fetch_content(url):
response = requests.get(url)
return url, len(response.content)
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.

最低0.47元/天 解锁文章
1303

被折叠的 条评论
为什么被折叠?



