在Python中实现HTTP并发请求,线程池、协程、进程池是三种典型方案,各有适用场景与性能特征。
1. 线程池(ThreadPool)****
原理:利用多线程并行处理I/O密集型任务,通过concurrent.futures模块实现。
python复制代码
| from concurrent.futures import ThreadPoolExecutor | |
|---|---|
| import requests | |
| def fetch(url): | |
| return requests.get(url) | |
| with ThreadPoolExecutor(max_workers=10) as executor: | |
| futures = [executor.submit(fetch, url) for url in urls] | |
| results = [f.result() for f in futures] |
特点:
· 适合I/O密集型场景(如API调用)
· 受GIL限制,CPU密集型任务效率低
· 内存共享方便,但线程切换有开销
2. 协程(Coroutine)****
原理:通过异步I/O实现单线程并发,常用asyncio+aiohttp组合。
python复制代码
| import asyncio | |
|---|---|
| import aiohttp | |
| async def fetch(session, url): | |
| async with session.get(url) as resp: | |
| return await resp.text() | |
| async def main(): | |
| async with aiohttp.ClientSession() as session: | |
| tasks = [fetch(session, url) for url in urls] | |
| results = await asyncio.gather(*tasks) | |
| asyncio.run(main()) |
特点:
· 超高并发能力(万级连接)
· 内存消耗极低(单线程)
· 需异步编程模型,复杂业务适配成本高
3. 进程池(ProcessPool)****
原理:多进程绕过GIL限制,适合CPU密集型任务。
python复制代码
| from concurrent.futures import ProcessPoolExecutor | |
|---|---|
| def process_data(data): | |
| # CPU密集型处理 | |
| return result | |
| with ProcessPoolExecutor() as executor: | |
| results = list(executor.map(process_data, raw_data)) |
特点:
· 真正并行计算,适合复杂数据处理
· 进程间通信(IPC)开销大
· 内存隔离,适合安全敏感场景
性能对比****
| 方案 | 适用场景 | 内存占用 | 并发量 | 编程复杂度 |
|---|---|---|---|---|
| 线程池 | I/O密集型 | 中 | 百级 | 低 |
| 协程 | 超高I/O并发 | 低 | 万级 | 高 |
| 进程池 | CPU密集型/安全隔离需求 | 高 | 十级 | 中 |
选型建议:
· API批量调用 → 协程
· 网页抓取 → 线程池
· 数据处理流水线 → 进程池+线程池混合
实际开发中,可结合uvloop优化协程性能,或采用ray框架实现分布式任务调度,根据具体场景选择最佳并发模型。