python concurrent.futures

concurrent.futures

线程池核心类:ThreadPoolExecutor

  • 构造函数参数
ThreadPoolExecutor(max_workers=None, thread_name_prefix='', ...)
* max_workers:最大线程数,默认为CPU核心数×514。
* thread_name_prefix:线程名前缀(Python 3.6+支持)。
  • 二、核心函数及方法
  1. 提交任务: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() 获取结果(阻塞)
  1. 批量提交:map()
results = executor.map(task,  [1, 2, 3])  # 按顺序返回结果迭代器 
* 适合处理有序任务,结果顺序与输入一致。 
  1. 等待完成: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。
  1. add_done_callback()
def callback(future):
    print(f"Result: {future.result()}") 
 
future.add_done_callback(callback)   # 任务完成时自动触发 
  1. 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值