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

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)

相关文章:

  • 基于YOLO11深度学习的果园苹果检测与计数系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • 【Spring生命周期】Bean元信息配置阶段
  • Python Selenium自动化操作详解:从入门到实战
  • JavaScript中的函数基础知识
  • win10本地部署deepseek-r1步骤
  • 用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
  • 在 Vue 项目中,为什么要在列表组件中写 key,其作用是什么?
  • 什么是幂等性?
  • 【SpringMVC】Controller的多种方式接收请求参数
  • DeepSeek模型快速部署教程-搭建自己的DeepSeek
  • 在Unity中用简单工厂模式模拟原神中的元素反应
  • DeepSeek服务器繁忙 多种方式继续优雅的使用它
  • MySQL 的存储引擎有哪些?它们之间有什么区别? MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别? MySQL 的索引类型有哪些?
  • 框架篇 - Hearth ArcGIS 框架扩展(DryIoC、Options、Nlog...)
  • XCP协议
  • 【刷题】leetcode
  • var、let、const区别
  • 项目中分库分表的分布式ID如何生成
  • 数据结构与算法-搜索-bfs(floodfill and 最短路):池塘计数,城堡问题,山峰和山谷,迷宫问题,武士分度的牛,抓住那头牛
  • 深入理解 QObject的作用
  • 外卖员投资失败负疚离家流浪,经民警劝回后泣不成声给父母下跪
  • 我驻苏丹使馆建议在苏中国公民尽快撤离
  • 5月12日至13日北京禁飞“低慢小”航空器
  • 驱逐行动再加码?特朗普或向利比亚和卢旺达遣送非法移民
  • 印度导弹凌晨打击巴基斯坦多座设施,巴总理:正对战争行为作有力回应
  • 退休11年后,71岁四川厅官杨家卷被查