`concurrent.futures` 是 Python 标准库中的一个模块
先来看文档
concurrent.futures
是 Python 标准库中的一个模块,它提供了一个高级接口来异步执行代码,使用线程或进程池来并行运行任务。这个模块提供了两种主要的池类型:ThreadPoolExecutor
和 ProcessPoolExecutor
,以及一个通用的 Executor
接口。此外,Executor
接口中的 submit
方法用于提交任务给执行器执行。
1. ThreadingPoolExecutor
ThreadPoolExecutor
使用线程池来并行执行任务。由于线程共享同一个进程的内存空间,因此线程间通信和共享数据相对容易,但这也意味着它们不能充分利用多核处理器的优势,因为 Python 的全局解释器锁(GIL)限制了同一时间只有一个线程可以执行 Python 字节码。
2. ProcessPoolExecutor
ProcessPoolExecutor
使用进程池来并行执行任务。每个进程都有自己独立的内存空间,因此它们可以绕过 GIL,充分利用多核处理器的优势。然而,进程间通信和共享数据比线程间要复杂和昂贵。
3. Executor.submit
submit
方法是 Executor
接口的一部分,用于提交一个可调用的对象(通常是函数)给执行器执行。它返回一个 Future
对象,这个对象可以用来查询任务的状态、获取任务的返回值或取消任务。
示例
使用 ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
import timedef task(n):time.sleep(2)return n * nwith ThreadPoolExecutor(max_workers=3) as executor:futures = [executor.submit(task, i) for i in range(10)]for future in futures:print(future.result())
在这个例子中,我们创建了一个 ThreadPoolExecutor
,其最大工作线程数为 3。然后,我们提交了 10 个任务给执行器,每个任务调用 task
函数,并等待每个任务完成,打印其返回值。
使用 ProcessPoolExecutor
from concurrent.futures import ProcessPoolExecutor
import osdef task(n):return os.getpid(), n * nwith ProcessPoolExecutor(max_workers=3) as executor:futures = [executor.submit(task, i) for i in range(10)]for future in futures:pid, result = future.result()print(f"PID: {pid}, Result: {result}")
在这个例子中,我们创建了一个 ProcessPoolExecutor
,其最大工作进程数为 3。每个任务调用 task
函数,返回当前进程的 PID 和 n * n
的结果。我们打印每个任务的进程 ID 和结果,以展示任务是在不同的进程中执行的。
总结
ThreadPoolExecutor
适用于 I/O 密集型任务,因为线程间通信成本低。ProcessPoolExecutor
适用于 CPU 密集型任务,因为它可以绕过 GIL,充分利用多核处理器。submit
方法用于提交任务给执行器,并返回一个Future
对象用于查询任务状态或获取结果。
在 concurrent.futures
模块中,submit
函数是 Executor
接口的一部分,用于提交一个可调用的对象(如函数)给执行器(如 ThreadPoolExecutor
或 ProcessPoolExecutor
)异步执行。以下是对 submit
函数参数的详细说明,以及为何 name=value
时是实参,而 **kwargs
是形参的解释。
submit 函数的参数
submit
函数的定义通常如下:
submit(fn, *args, **kwargs)
fn
:这是需要异步执行的函数。它应该是一个可调用的对象,如函数、方法或实现了__call__
方法的类的实例。*args
:这是传递给fn
函数的位置参数。*args
允许你传递任意数量的位置参数给fn
。**kwargs
:这是传递给fn
函数的关键字参数。**kwargs
允许你传递任意数量的关键字参数给fn
,这些参数在函数调用时以name=value
的形式传递。
实参(Actual Arguments)与形参(Formal Parameters)
-
实参:在函数调用时传递给函数的实际值。在
submit
函数的上下文中,当你使用name=value
的形式传递参数时,这些name=value
对就是实参。例如,在executor.submit(my_function, x=10, y=20)
中,x=10
和y=20
就是实参。 -
形参:在函数定义中声明的参数。在
submit
函数被调用的函数fn
的上下文中,fn
函数定义中声明的参数就是形参。例如,如果fn
定义为def my_function(x, y)
,则x
和y
就是形参。
当你使用 **kwargs
在 submit
函数中传递参数时,这些参数以关键字参数的形式传递给 fn
函数。由于 **kwargs
在 submit
函数定义中是一个形参(它接受任意数量的关键字参数),而这些关键字参数在 submit
被调用时成为传递给 fn
函数的实参。
示例
假设我们有一个简单的函数 my_function
,它接受两个参数 x
和 y
,并返回它们的和:
def my_function(x, y):return x + y
我们可以使用 ThreadPoolExecutor
和 submit
函数来异步调用 my_function
:
from concurrent.futures import ThreadPoolExecutorwith ThreadPoolExecutor(max_workers=1) as executor:future = executor.submit(my_function, x=10, y=20) # 这里 x=10, y=20 是实参result = future.result() # 获取异步执行的结果print(result) # 输出: 30
在这个例子中,x=10
和 y=20
是传递给 my_function
的实参,而 x
和 y
是 my_function
的形参。**kwargs
在 submit
函数中允许我们以关键字参数的形式传递这些实参给 my_function
。
相关文章:

`concurrent.futures` 是 Python 标准库中的一个模块
先来看文档 concurrent.futures 是 Python 标准库中的一个模块,它提供了一个高级接口来异步执行代码,使用线程或进程池来并行运行任务。这个模块提供了两种主要的池类型:ThreadPoolExecutor 和 ProcessPoolExecutor,以及一个通用的…...

PicoQuant GmbH公司Dr. Christian Oelsner到访东隆科技
昨日,德国PicoQuant公司的光谱和显微应用和市场专家Dr.Christian Oelsner莅临武汉东隆科技有限公司。会议上Dr. Christian Oelsner就荧光寿命光谱和显微技术的最新研究和应用进行了深入的交流与探讨。此次访问不仅加强了两家公司在高科技领域的合作关系,…...

leetcode128最长连续序列 golang版
题目描述 题目:给定一个未排序的整数数组 nums 找出数字连续的最长序列,不要求序列 元素在原数组中连续 的长度 请你设计并实现时间复杂度为On的算法解决此问题 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 解释&…...

【OpenCV】(六)—— 阈值处理
阈值处理(Thresholding)用于将灰度图像转换为二值图像。通过设定一个或多个阈值,可以将图像中的像素分为不同的类别,通常用于分割前景和背景、简化图像、去除噪声等任务。OpenCV 提供了多种阈值处理方法,下面介绍基本阈…...

重学SpringBoot3-集成Redis(九)之共享Session
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(九)之共享Session 1. 为什么需要 Session 共享2. Spring Session 和 Redis 的集成2.1. 引入依赖2.2. 配置 Redis 连接…...

Linux:信号保存与处理
使用kill -l命令查看信号: 信号量和信号确实一点关系没有 信号是操作系统发出的进程与进程之间的通知于中断,是进程之间时间异步通知的一种方式 先了解同步通信:同步通信是一种比特同步通信技术,要求发收双方具有同频同相的同步…...
工具方法 - 可选的一些AI聊天机器人
1, ChatGPT OpenAI https://chatgpt.com/ 2, Microsoft Copilot Microsoft Copilot: 你的 AI 助手 Microsoft Copilot: 你的 AI 助手 3, HuggingChat Hugging Face – The AI community building the future. https://huggingface.co/ https://huggingface.co/chat/ 4,…...
YOLOv11改进策略【卷积层】| CVPR-2023 ScConv:即插即用,减少冗余计算并提升特征学习
一、本文介绍 本文记录的是利用ScConv优化YOLOv11的目标检测网络模型。深度神经网络中存在大量冗余,不仅在密集模型参数中,而且在特征图的空间和通道维度中。ScConv模块通过联合减少卷积层中空间和通道的冗余,有效地限制了特征冗余,本文利用ScConv模块改进YOLOv11,提高了…...

总结拓展十四:批次管理(2)
1、批次管理后台配置 1.1 批次管理级别配置(T-code:OMTC) ——路径:IMG->后勤-常规->批次管理->指定级别并激活状态管理 1.2 批次状态管理配置(T-code:OMTC) ——路径:IMG->后勤-常规->批次管理->指定级别并激活状态管理 批状态管…...

架构设计笔记-18-安全架构设计理论与实践
知识要点 常见的安全威胁: 信息泄露:信息被泄露或透露给某个非授权的实体。破坏信息的完整性:数据被非授权地进行增删、修改或破坏而受到损失。拒绝服务:对信息或其他资源的合法访问被无条件地阻止。攻击者向服务器发送大量垃圾…...
Python网络爬虫
随着互联网的迅猛发展,数据成为了新的“石油”。人们对于信息的需求日益增涨,尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术,因其强大的能力而备受关注。而Python,凭借其简洁的语法和丰富…...
38. 外观数列
目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 「外观数列」是一个数位字符串序列,由递归公式定义: countAndSay(1) "1"countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码(RLE&am…...
Android中的三种数据存储方式
目录 1.文件存储 1)内部存储 1--MODE_PRIVATE: 2--MODE_APPEND: 3--MODE_WORLD_READABLE: 4--MODE_WORLD_WRITEABLE: 5--简单使用 3)外部存储 4)内部读取 4)外部读取 2.SharePreferences存储 1)基本概念 2)…...
VS2022中Qt环境配置步骤
VS2022中Qt环境配置步骤 一、安装QT 下载QT:从QT官网上下载QT,在安装过程中,可以根据自己的需求选择适合的QT版本。若不确定,建议选择最新版本,这有助于提高开发效率。 二、安装Visual Studio 2022 选择组件&#…...
【前端】 常用的版本控制符号汇总
前端的版本控制符主要用于管理前端项目中依赖包的版本。它们通常在package.json文件中定义,帮助开发者指定所需的库和框架的版本范围。以下是一些关键概念: 版本控制符号详解: 1. 依赖管理 在前端开发中,依赖管理工具ÿ…...
OWASP Top 10 漏洞详解:基础知识、面试常问问题与实际应用
OWASP(开放式Web应用程序安全项目)是一个全球性非营利组织,致力于提高软件安全性。OWASP Top 10 是其发布的十大Web应用程序安全风险列表,广泛应用于安全领域的学习和实践。本文将详细介绍OWASP Top 10 漏洞的基础知识、面试常见问…...

实景三维赋能自然资源精细化管理创新
在自然资源管理领域,如何实现精细化、高效化管理一直是我们面临的挑战。随着实景三维技术的兴起,这一挑战迎来了新的解决方案。今天,我们将探讨实景三维技术如何赋能自然资源的精细化管理。 1. 实景三维技术概述 实景三维技术是一种集成了遥…...

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化
近几年由于材料科学的进步,软机器人相关技术近几年研究成果显著,与传统的刚性机器人相比,软机器人的设计灵感来源于自然界中的生物系统,如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料,在复杂环境中展现…...

C++ 的特性可以不用在主函数中调用
写完代码,都找不到从哪里进去...

香港大学神作 LightRAG 横空出世!AI 检索生成系统革命,秒懂复杂信息,动态数据无所遁形!
❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 微信订阅号|搜一搜&…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...