当前位置: 首页 > article >正文

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)


http://www.kler.cn/a/553881.html

相关文章:

  • 【2025最新计算机毕业设计】基于SSM的社区老人服务平台 可定制开发【提供源码+答辩PPT+文档+项目部署】
  • 【LLAMA】羊驼从LLAMA1到LLAMA3梳理
  • SpringBoot+uniApp日历备忘录小程序系统 附带详细运行指导视频
  • [Android]文件描述符的binder传送
  • 迅为iTOP-RK3576开发板/核心板6TOPS算力4K视频编解码
  • Redis 键对应的命令详解
  • mysql实现原理 - 字符集和排序规则
  • Python安装与环境配置全程详细教学(包含Windows版和Mac版)
  • [网络] 如何开机自动配置静态IP,并自动启动程序
  • 第六步:Python协议与模块——当字典化身数据库,import玩出花
  • python的类与对象。为什么有些东西要用到类和对象。普通的编程方式不行吗?
  • 项目管理工具Jira在营销工作管理中的应用与实践
  • BMS保护板测试仪:电池安全与性能的坚实守护者
  • ssm121基于ssm的开放式教学评价管理系统+vue(源码+包运行+LW+技术指导)
  • 关于项目证书登录流程
  • wps中的js开发
  • Vue 计算属性(computed)
  • 个人简历html网页模板,科技感炫酷html简历模板
  • 大数据的特点
  • vue单据打印 一维码、二维码实现