Python 高级(四):线程池 ThreadPoolExecutor

news2024/11/20 12:35:50

在这里插入图片描述
大家好,我是水滴~~

当涉及到需要同时处理多个任务的情况时,使用线程池是一种高效的方法。Python提供了concurrent.futures模块,其中的ThreadPoolExecutor类使得使用线程池变得非常方便。本文将详细介绍Python线程池的概念、使用方法和示例代码。

文章中包含大量的示例代码,希望能够帮助新手同学快速入门。

《Python入门核心技术》专栏总目录・点这里

文章目录

  • 一、什么是线程池?
    • 1.1 线程池的组件
    • 1.2 线程池的作用
  • 二、Python中的线程池
    • 2.1 创建线程池
    • 2.2 获取任务执行结果
    • 2.3 控制线程池的关闭
  • 总结


一、什么是线程池?

线程池(Thread Pool)是一种管理和复用线程的技术,用于优化多线程的创建和销毁过程。它通过预先创建一组线程,并维护一个任务队列,可以高效地执行并发任务,提高程序的性能和资源利用率。
在多线程编程中,每个线程的创建和销毁都会带来一定的开销。而线程池可以在程序启动时创建一组线程,并将任务提交给线程池进行处理。线程池中的线程可以复用,避免了线程的频繁创建和销毁,从而减少了开销。

1.1 线程池的组件

线程池一般包括以下组件:

  • 线程池管理器(ThreadPool Manager):负责线程池的创建、销毁和管理,包括线程的创建、回收和分配等操作。
  • 任务队列(Task Queue):用于存储待执行的任务。当任务提交给线程池时,会被添加到任务队列中。
  • 工作线程(Worker Threads):线程池中的线程,用于执行任务队列中的任务。工作线程会不断地从任务队列中获取任务并执行。

1.2 线程池的作用

使用线程池的主要好处包括:

  • 降低线程创建和销毁的开销:线程池中的线程可以被重复利用,避免了频繁创建和销毁线程的开销。
  • 限制并发线程数量:线程池可以根据系统资源和配置限制并发线程的数量,避免同时创建过多的线程导致资源竞争和性能下降。
  • 提高任务执行效率:线程池可以根据任务的数量和系统资源情况动态调整线程的数量,以提高任务的执行效率。

二、Python中的线程池

Python中的线程池由ThreadPoolExecutor类实现,它是concurrent.futures模块的一部分。使用线程池可以简化多线程编程,使得代码更加清晰和易于管理。

2.1 创建线程池

要使用线程池,首先需要导入concurrent.futures模块,然后使用ThreadPoolExecutor类创建线程池对象。ThreadPoolExecutor的构造函数接受一个可选的max_workers参数,用于指定线程池中的最大线程数。如果未指定max_workers,线程池将根据需要动态增加或减少线程的数量。

以下是创建线程池的示例代码:

from concurrent.futures import ThreadPoolExecutor

# 创建线程池
with ThreadPoolExecutor(max_workers=4) as executor:
    # 在线程池中执行任务
    for i in range(10):
        executor.submit(my_task, i)

在这个示例中,我们创建了一个包含4个线程的线程池。然后,使用executor.submit()方法提交了10个任务给线程池。submit()方法接受一个可调用对象(如函数)和它的参数,并将任务添加到线程池的任务队列中。

2.2 获取任务执行结果

submit()方法返回一个Future对象,代表任务的未来结果。我们可以使用Future对象的result()方法来获取任务的执行结果。

以下是获取任务执行结果的示例代码:

from concurrent.futures import ThreadPoolExecutor

# 定义一个任务函数
def my_task(number):
    return number * 2

# 创建线程池
with ThreadPoolExecutor() as executor:
    # 提交任务给线程池
    futures = [executor.submit(my_task, i) for i in range(10)]

    # 获取任务执行结果
    for future in futures:
        result = future.result()
        print("Task result:", result)

在这个示例中,我们定义了一个简单的任务函数my_task(),它接收一个数字作为参数,并返回该数字的两倍。

然后,我们使用线程池的submit()方法提交了10个任务给线程池,并将返回的Future对象存储在一个列表中。

最后,我们使用result()方法获取每个任务的执行结果,并打印出来。

需要注意的是,result()方法是一个阻塞调用,它会等待任务执行完成并返回结果。如果任务尚未完成,result()方法会阻塞当前线程,直到任务执行完成并返回结果。

2.3 控制线程池的关闭

使用完线程池后,应该及时关闭它以释放资源。可以使用shutdown()方法来关闭线程池,并等待所有任务执行完成。

以下是关闭线程池的示例代码:

from concurrent.futures import ThreadPoolExecutor

# 创建线程池
with ThreadPoolExecutor() as executor:
    # 在线程池中执行任务
    for i in range(10):
        executor.submit(my_task, i)

# 关闭线程池
executor.shutdown()

在这个示例中,我们使用shutdown()方法关闭线程池。关闭线程池后,将不再接受新的任务,同时等待已提交的任务执行完成。

总结

线程池是一种管理和复用线程的技术,能够优化多线程的创建和销毁过程。Python提供了concurrent.futures模块中的ThreadPoolExecutor类来实现线程池。通过预先创建一组线程并维护任务队列,线程池能够高效地执行并发任务,提高程序性能和资源利用率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 AnyGo 修改 iPhone 手机定位

在当今数字化时代,我们的手机已经成为我们日常生活中不可或缺的一部分。然而,有时我们可能会遇到一些情况,需要修改手机的定位信息。这个需求可能来自于各种不同的原因,包括但不限于保护个人隐私、测试应用程序的地理位置相关功能…

数据仓库【5】:项目实战

数据仓库【5】:项目实战 1、项目概述1.1、项目背景1.2、复购率计算 2、数据描述3、架构设计3.1、数据仓库架构图 4、环境搭建4.1、环境说明4.2、集群规划4.3、搭建流程 5、项目开发5.1、业务数据生成5.2、ETL数据导入5.3、ODS层创建&数据接入5.4、DWD层创建&…

【面试】Java中的多种设计模式(十种主要设计模式)

Java中的多种设计模式(十种主要设计模式) 文章概述 设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。它是软件工程中常见问题的解决方案的一种描述或模板。设计模式可以提供一种通用的、可重用的解决方案,帮助开发…

leetcode 75. 颜色分类(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public void sortColors(int[] nums) {int left-1,rightnums.length,i0;while(i<right){if(nums[i]0){left;swap(nums,left,i);i;}else if(nums…

【学习笔记】Java函数式编程03 Stream流-终结操作

书接上回 3.3.3 终结操作 3.3.3.1 forEach 对集合的每一个元素进行处理 接触很多了不赘述 3.3.3.2 count 用来获取当前流中的元素的个数 比如&#xff0c;打印出所有作家的作品的总数 System.out.println(authors.stream().flatMap(author -> author.getBooks().stre…

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示&#xff0c;求 A, A2, A3, A4&#xff0c;并回答诸问题&#xff1a; 中间有几章这里没有写&#xff0c;感兴趣可以自己去学&#xff0c;组合数学跟高中差不多&#xff0c…

2024,华为重塑笔记本的“创新周期”

作者 | 曾响铃 文 | 响铃说 谈及电脑PC&#xff0c;相信不少消费者都会下意识地给行业贴一个标签&#xff1a;夕阳行业。毕竟当下已经是移动互联网时代&#xff0c;传统PC的使用场景不断萎缩&#xff0c;市场研究机构Gartner报告显示&#xff0c;截至2023年第三季度&#xff…

LLM应用于MPC

现有的基于学习的自动驾驶系统&#xff08;AD&#xff09;在理解高级信息和提供可解释性方面存在挑战。为了解决这些问题&#xff0c;这项工作采用LLM作为复杂AD场景的决策组件。作者设计了认知途径&#xff08;cognitive pathway&#xff09;来实现LLM的综合推理&#xff0c;并…

python作业题百度网盘,python作业答案怎么查

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python作业题百度网盘&#xff0c;python作业答案怎么查&#xff0c;今天让我们一起来看看吧&#xff01; 1 以下代码的输出结果为&#xff1a; alist [1, 2, 3, 4] print(alist.reverse()) print(alist) A.[4, 3, 2, …

Python爬虫中的代理IP设置与实战策略

在Python爬虫中&#xff0c;使用代理IP设置是一种常见的策略&#xff0c;主要用于以下几个目的&#xff1a; 1. 避免被目标网站封禁&#xff1a;频繁的请求可能会引起目标网站的注意&#xff0c;导致你的IP被封锁。通过使用代理IP&#xff0c;你可以模拟来自不同地点和设备的请…

【WPF】使用Behavior以及ValidationRule实现表单校验

文章目录 使用ValidationRule实现检测用户输入EmptyValidationRule 非空校验TextBox设置非空校验TextBox设置非空校验并显示校验提示 结语 使用ValidationRule实现检测用户输入 EmptyValidationRule是TextBox内容是否为空校验&#xff0c;TextBox的Binding属性设置ValidationRu…

AR智慧校园三维主电子沙盘系统研究及应用

一 、概述 易图讯科技(www.3dgis.top)自主研发的智慧校园三维主电子沙盘系统&#xff0c;采用B/S架构模式&#xff0c;采用自主可控高性能WebGIS可视化引擎&#xff0c;支持多用户客户端通过网络请求访问服务器地图和专题数据&#xff0c;提供地理信息数据、专题数据的并发访问…

爬虫工作量由小到大的思维转变---<第二十八章 Scrapy中间件说明书>

爬虫工作量由小到大的思维转变---&#xff1c;第二十六章 Scrapy通一通中间件的问题&#xff1e;-CSDN博客 前言: (书接上面链接)自定义中间件玩不明白? 好吧,写个翻译的文档点笔记,让中间件更通俗一点!!! 正文: 全局图: 爬虫中间件--->翻译笔记: from scrapy import s…

ES慢查询分析——性能提升6 倍

问题 生产环境频繁报警。查询跨度91天的数据&#xff0c;请求耗时已经来到了30s。报警的阈值为5s。 背景 查询关键词简单&#xff0c;为‘北京’ 单次仅检索两个字段 查询时间跨度为91天&#xff0c;覆盖数据为450亿数据 问题分析 使用profle分析&#xff0c;复现监控报警的…

Go在Win10上接收UDP组播数据

第一步、绑定本机某张网卡的IP和端口&#xff0c;本代码选择IP为0.0.0.0&#xff0c;端口为8000&#xff1b;第二步、加入组播&#xff0c;组播地址为“224.0.0.1”&#xff1b;第三步、循环接收UDP组播数据&#xff1b; 代码 package mainimport ("fmt""golang…

从 Linux Crontab 到 K8s CronJob,定时任务正在经历怎样的变革

作者&#xff1a;黄晓萌(学仁) 背景 Job 表示短周期的作业&#xff0c;定时 Job 表示按照预定的时间运行Job&#xff0c;或者按照某一频率周期性的运行 Job。比如&#xff1a; 许多传统企业使用 Linux 自带的 crontab 来做定时任务的方案&#xff0c;该方案非常简单&#xff…

“巴渝工匠杯”2022年重庆市职业院校技能大赛(高职组)云计算样题

“巴渝工匠杯”2022年重庆市职业院校技能大赛&#xff08;高职组&#xff09;云计算样题 需要软件包环境可私信博主 【赛程名称】云计算赛项第一场次-私有云 某企业拟使用OpenStack搭建一个企业云平台&#xff0c;以实现资源池化弹性管理、企业应用集中管理、统一安全认证和授…

PostGIS学习教程十五:几何图形的有效性

PostGIS学习教程十五&#xff1a;几何图形的有效性 在90%的情况下&#xff0c;“为什么我的查询给了我一个’TopologyException’错误"的问题的答案是"一个或多个输入的几何图形是无效的”&#xff0c;这就引出了这样一个问题:几何图形"无效"是什么意思&a…

从计算机内存结构到iOS

一、冯.诺伊曼结构 当前计算机都是冯.诺伊曼结构&#xff08;Von Neumann architecture&#xff09;&#xff0c;是指存储器存放程序的指令以及数据&#xff0c;在程序运行时根据需要提供给CPU使用。 冯.诺伊曼瓶颈 在目前的科技水平之下&#xff0c;CPU与存储器之间的读写速…

【C Primer Plus第六版 学习笔记】第十四章 结构和其他数据形式

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 建立结构声明&#xff1a;描述该对象由什么组成&#xff0c;即结构布局 格式&#xff1a; 关键字 标记&#xff08;可选&#xff09;{结构 }&#xff1b; 举例&#xff1a; struct book{char title[2];char author[4];float …