python concurrent.futures
concurrent.futures
线程池核心类:ThreadPoolExecutor
- 构造函数参数
ThreadPoolExecutor(max_workers=None, thread_name_prefix='', ...)
* max_workers:最大线程数,默认为CPU核心数×514。
* thread_name_prefix:线程名前缀(Python 3.6+支持)。
- 二、核心函数及方法
- 提交任务:submit()
from concurrent.futures import ThreadPoolExecutor
def task(n):
return n * 2
with ThreadPoolExecutor(max_workers=3) as executor:
future = executor.submit(task, 5) # 提交单个任务
* 返回 Future 对象,可通过 .result() 获取结果(阻塞)
- 批量提交:map()
results = executor.map(task, [1, 2, 3]) # 按顺序返回结果迭代器
* 适合处理有序任务,结果顺序与输入一致。
- 等待完成:wait()
from concurrent.futures import wait
futures = [executor.submit(task, i) for i in range(5)]
done, not_done = wait(futures, timeout=2, return_when="FIRST_COMPLETED")
* return_when:可选 ALL_COMPLETED(默认)、FIRST_COMPLETED、FIRST_EXCEPTION。
- add_done_callback()
def callback(future):
print(f"Result: {future.result()}")
future.add_done_callback(callback) # 任务完成时自动触发
- as_completed()
from concurrent.futures import as_completed
for future in as_completed(futures):
print(future.result())
参数进阶说明
- 任务队列机制:
当线程数达 max_workers,新任务进入队列等待(默认使用无界队列 queue.Queue)。 - 线程复用:
空闲线程存活时间由内部管理,Python未暴露参数(与Java不同)。 - 拒绝策略:
队列满时默认抛出 queue.Full 异常,需自行处理
示例
- 多参数任务
def complex_task(a, b, c=0):
return a + b + c
# 参数传递方式
future = executor.submit(complex_task, 1, 2, c=3)
- 网页抓取(I/O密集型)
import requests
def fetch(url):
response = requests.get(url)
return response.status_code
urls = ["http://example.com"] * 10
with ThreadPoolExecutor(5) as executor:
results = list(executor.map(fetch, urls))
- 动态任务进度监控
from tqdm import tqdm
futures = [executor.submit(task, i) for i in range(100)]
for f in tqdm(as_completed(futures), total=len(futures)):
pass # 实时显示完成进度
CPU密集型:线程数 ≤ CPU核心数。
I/O密集型:线程数可设较高(如50-100)