Python 高级(四):线程池 ThreadPoolExecutor

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

当涉及到需要同时处理多个任务的情况时,使用线程池是一种高效的方法。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类来实现线程池。通过预先创建一组线程并维护任务队列,线程池能够高效地执行并发任务,提高程序性能和资源利用率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理

在防止SQL注入的方法中,预编译是十分有效的,它在很大程度上解决了SQL注入问题。 SQL注入简析 数据库查询语句未对SQL注入做任何防护时,语句基本如下: $name$_POST[name]; $pass$_POST[pass]; $sql"SELECT * FROM user W…

展望2024的区块链世界,铭文将是绕不开的话题

近期,加密领域的热点焦点不断涌现,但毫无疑问,"铭文"这个词汇已经成为了近两个月内广受瞩目的关键词之一。像ORDI、SATS、RATS等铭文项目在比特币区块链上获得了惊人的增长,为持有者带来了巨大的财富效应。铭文热潮已经…

图片批量处理:图片批量缩放,高效调整尺寸的技巧

在数字媒体时代,图片处理已是日常生活和工作中不可或缺的一部分。有时候要批量处理图片,如缩放图片尺寸,以满足不同的应用需求。现在一起来看看办公提效式具如何高效的将图片批量处理方法,快速、准确地批量调整图片尺寸操作。 下…

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表: 数据库中有三张表,分别为student,course,SC(即学生表,课程表,选课表) 问题: --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

封装map和set

文章目录 封装mapset红黑树成员变量节点定义KeyOfTMapKeyOfTSetKeyOfT begin() && end()迭代器迭代器类operatoroperator- - insert 封装 map和set的底层都是通过红黑树来实现的,那么是怎么做到共用同一份代码,但让map存储的是键值对&#xff0…

多功能演示工具ProVideoPlayer2 mac特色介绍

ProVideoPlayer2 mac是用于大多数任何生产的首选多功能演示工具。ProVideoPlayer 2是一种动态视频播放和处理媒体服务器,可将视频映射(包括播放和实时视频输入)实时控制到一个或多个输出。包括实时效果,调度,网络同步和…

(AntV X6)vue2项目流程图实现

(AntV X6)vue2流程图实现 项目:gitLab/zhengzhouyuan 效果: 一、项目引入X6 npm install antv/x6 --save 二、引入相关插件 npm install --save antv/x6-plugin-clipboard antv/x6-plugin-history antv/x6-plugin-keyboard antv/x6-plugin-selection an…

海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效

近日,2023北京国际金融安全论坛暨金融科技标准认证生态大会在北京金融安全产业园成功举办。深圳海云安网络安全技术有限公司(以下简称“海云安”)受邀参展亮相此次大会。海云安作为国内领先的金融科技服务商,展示了开发安全系列产…

数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历 后序遍历 一.树的概念 树是一种非线性数据结构,它由节点和边组成。树的每个节点可以有零个或多个子节点…

输入两个时间,判断时间是否为非工作日,并且是日期否为同一天。是的话返回true,否返回false

工作遇到这么一个逻辑,前端回传两个时间(必须是两个那一种)。然后,我后端需要判断这两个时间是否为同一天,并且这个时间是否为非工作日,是的话返回true,反之返回false 代码: packa…

2023/12/26 work

1. 定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;实现求字符串大小的函数。 #include <iostream>using namespace std;namespace mynamespace {string name;unsigned int strlen(string name){return name.size();} }using namespace…

面试题之二HTTP和RPC的区别?

面试题之二 HTTP和RPC的区别&#xff1f; Ask范围&#xff1a;分布式和微服务 难度指数&#xff1a;4星 考察频率&#xff1a;70-80% 开发年限&#xff1a;3年左右 从三个方面来回答该问题&#xff1a; 一.功能特性 1)HTTP是属于应用层的协议&#xff1a;超文本传输协议…

手机蓝牙在物联网超市中的应用

超市一站式购物已进入城市的千家万户。然而人们在选购时却采用直接翻阅商品的方式&#xff0c;既不方便又不卫生甚至大大缩短食品类商品保质期&#xff0c;也给超市商品管理造成很大难度。物联网(The Internet of things)基于射频识别(RFID)、红外感应等技术&#xff0c;把物品…

【PostGIS】在Java中操作postgis——使用springboot+Maven+mybatis框架

前言&#xff1a; PostgreSQL15对应PostGIS安装教程及空间数据可视化 空间数据库-常用空间函数 完成PostGIS的安装与配置后&#xff0c;让我们来写一个Java操作postgis数据库的demo吧~ 使用工具&#xff1a; NavicatIDEA 一、PostGIS数据库准备 在Navicat中新建一个postgr…

云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

Golang 协程配合管道

请完成goroutine和channel协同工作的案例&#xff0c;具体要求&#xff1a; &#xff08;1&#xff09;开启一个writeData协程&#xff0c;向管道mtChan中写入50个整数. &#xff08;2&#xff09;开启一个readData协程&#xff0c;从管道intChan中读取writeData写入的数据。 &…

系列十(实战)、发送 接收批量消息(Java操作RocketMQ)

一、发送 & 接收批量消息 1.1、概述 批量消息是指RocketMQ可以把一组消息集合一次性发送&#xff0c;这一组消息会被当做一个消息供消费者消费。 1.2、Demo05MQTestApp /*** Author : 一叶浮萍归大海* Date: 2023/12/25 11:48* Description: 发送 & 接收批量消息*/ …

智能优化算法应用:基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MA…

python CodeFormer 图像(人脸面部)修复源码

介绍 github地址&#xff1a;https://github.com/sczhou/CodeFormer [NeurIPS 2022] Towards Robust Blind Face Restoration with Codebook Lookup Transformer 效果&#xff1a; 测试环境&#xff1a; anconda3python3.8 torch1.9.0cu111 pyqt5 部分代码&#xff1a; i…