Python HTTP并发请求:线程池 vs 协程 vs 进程池

118 阅读2分钟

在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框架实现分布式任务调度,根据具体场景选择最佳并发模型。