Python线程池实现的进阶知识

1.参数 max_workers 的设定

接前文 《Python多线程和线程池的下载实战用法 》中案例,继续分析
concurrent.futures.ThreadPoolExecutor() 是 Python 中的一个线程池实现,用于执行并发的任务。它可以通过参数 max_workers 来设置线程池的最大工作线程数。

在你提供的代码中,使用 ThreadPoolExecutor() 构建了一个线程池执行器,并通过列表推导式将 download_with_delay(url) 函数提交给线程池执行。这样可以并发地下载多个 URL。

区别在于是否指定 max_workers 参数:

  1. 不指定 max_workers 参数:如果不指定 max_workers 参数,ThreadPoolExecutor() 会根据系统自动选择一个合适的默认值作为最大工作线程数。这意味着线程池会根据需要动态调整线程数量,以适应当前的任务负载。

    with concurrent.futures.ThreadPoolExecutor() as executor:[executor.submit(download_with_delay, url) for url in urls]
    
  2. 指定 max_workers 参数:如果指定了 max_workers 参数,线程池会创建一个固定数量的工作线程。这些线程会被循环利用,直到所有任务完成。

    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:[executor.submit(download_with_delay, url) for url in urls]
    

指定 max_workers 参数可以控制线程池中的并发线程数量。根据具体的情况,你可以根据系统资源和任务需求来调整最大工作线程数。如果任务较少或资源有限,可以选择较小的值;如果任务较多且有足够的资源,可以选择较大的值。

需要注意的是,过多的线程数量可能会导致资源竞争和性能下降,因此需要根据实际情况进行调整。

2. max_workers 参数好还是不指定参数好

对于 ThreadPoolExecutor() 中的 max_workers 参数,是否指定应该根据具体情况而定。不同的情况下,可能需要不同的线程池配置。

如果你的系统资源有限,或者任务量较小,那么可以考虑不指定 max_workers 参数,让线程池根据需要动态调整线程数量,以避免占用过多的资源。

但是如果你的系统拥有足够的资源,并且需要处理大量的并发任务,那么可以通过指定 max_workers 参数来控制线程池中的并发线程数量。这样可以确保系统不会使用过多的资源,并提高任务执行效率。

另外,需要注意的是,在实际开发中,还需要考虑以下因素:

  • 任务及其执行时间:如果任务需要花费较长的时间才能完成,那么较大的线程池可能会占用过多的资源,导致整个系统的性能下降。
  • 系统资源:如果系统资源有限,那么较大的线程池可能会导致系统崩溃或出现其他问题。
  • 线程安全:线程池中的线程需要保持线程安全,避免出现数据竞争、死锁等问题。

因此,在实际开发中,需要综合考虑以上因素来确定是否需要指定 max_workers 参数,并根据具体情况进行调整。

3.如果考虑线程安全,该怎么指定max_workers 参数

在考虑线程安全时,需要确保多个线程并发执行时不会导致数据不一致或其他并发问题。对于 ThreadPoolExecutor() 中的 max_workers 参数,指定参数与线程安全本身没有直接关联,但是可以通过控制并发线程数量来间接影响线程安全。

在考虑线程安全时,可以采取以下措施:

  1. 使用线程安全的数据结构:选择使用线程安全的数据结构(例如 queue.Queue)来存储共享数据,以避免多个线程同时修改数据导致的问题。

  2. 合理地控制并发度:通过指定 max_workers 参数来控制线程池中的并发线程数量,避免因线程过多而导致资源竞争和性能下降。根据系统资源和任务需求,合理地设置最大工作线程数。

  3. 使用锁或同步机制:在必要的情况下,可以使用锁或其他同步机制来保护共享资源,确保多个线程访问时的线程安全性。

  4. 编写线程安全的代码:在编写并发代码时,需要考虑多线程并发执行可能带来的问题,编写线程安全的代码逻辑,避免出现数据竞争、死锁等问题。

在实际开发中,需要根据具体情况综合考虑上述因素,并根据需求来选择合适的线程安全策略和线程池配置。同时,也可以通过测试和性能分析来验证线程安全性和并发性能,从而优化线程池的配置参数。

4.经典案例

需求

有几万条数据,如果单个数据处理挨个处理的话,涉及下载,指定pdf文件进行ocr识别,其他pdf文件需求识别文件校验,最后把校验结果放在excel里,如何设计代码逻辑,使效率更快

分析

处理大量数据时,优化代码逻辑可以提高效率。根据你的描述,以下是一种可能的代码逻辑设计:

  1. 使用多线程或异步操作:将下载、OCR识别和校验等任务分配给多个线程或异步操作,以实现并发处理。这样可以节省等待时间,并提高整体处理速度。

  2. 使用连接池进行下载:使用连接池来管理下载请求,避免频繁地创建和关闭连接,提高下载效率。可以使用第三方库(如requests)提供的连接池功能。

  3. 并行执行OCR识别和文件校验:对于不同的PDF文件,可以同时进行OC

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

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

相关文章

SLAM学习入门--编程语言

文章目录 编程语言一、C/C++C 与 C++ 的区别(面向对象的特点)C++ 与 Python的区别判断struct的字节数static 作用Const 作用extern "C"的作用多态如何实现多态?虚函数虚函数怎么实现的?析构函数虚析构函数的作用virtual函数能不能用在构造函数中&#

Java集合/泛型篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、ArrayList和linkedList的区别二、HashMap和HashTable的区别三、Collection包结构,与Collections的区别四、泛型常用特点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

Spring系列学习四、Spring数据访问

Spring数据访问 一、Spring中的JDBC模板介绍1、新建SpringBoot应用2、引入依赖:3、配置数据库连接,注入dbcTemplate对象,执行查询:4,测试验证: 二、整合MyBatis Plus1,在你的项目中添加MyBatis …

Java 实现自动获取法定节假日

一、背景 在实现业务需求的过程中,遇到了需要计算 x 个工作日后的日期需求。由于工作日是每年国务院发布的,调休和休假都没有规律,所以无法使用算法进行计算。 一般的实现方案是自己维护一个工作日和调休的表,或者去爬取国务院发…

AutoSAR(基础入门篇)4.4-Autosar_BSW的Memory功能

Memory功能 一、Autosar_BSW的Memory 1、Memory 组件图 2、架构与术语解释 3、片内存储 4、片外存储

游戏加速器LSP/DLL导致WSL.EXE无法打开问题修复!

解决办法: https://github.com/microsoft/WSL/issues/4177#issuecomment-597736482 方法一:(管理员身份) netsh winsock reset 方法二: WSCSetApplicationCategory 函数设置LSP加载权限 bool NoLsp(const wchar_t* …

从零开始:使用 BIND 构建和管理您的 DNS 服务器

1 前言 在这篇文章中,我将详细介绍如何使用 BIND(Berkeley Internet Name Domain)软件包中的 named 程序来配置和管理一个基本的 DNS 服务器。 从安装 BIND 开始,到设置 DNS 区域文件,再到运行和测试您的服务器&#x…

Oracle 19c OCP 1z0 082考场真题解析第17题

考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …

通过数字证书对PDF电子文件进行数字签名/盖章

以下代码详细说明如何使用数字证书对PDF电子文件进行数字签名/盖章。PDF文件签署主要传递PDF文件,数字证书信息,签章图片3个信息。代码中需要的文件、数字证书、签章图片可访问开放签电子签章开源系统详细了解系统的实现与效果。也可通过gitee开源社区下…

AQS之ReentrantReadWriteLock

AQS之ReentrantReadWriteLock 一. 归纳总结 ReentrantReadWriteLock适合读多写少的场景。是可重入的读写锁实现类。其中, 写锁是独占的,读锁是共享的。 支持锁降级(持有写锁、获取读锁,最后释放写锁的过程) 锁降级可以帮助我们…

2023-12-30 msys2的python包降级

点击 <C 语言编程核心突破> 快速C语言入门 msys2的python包降级 前言总结 前言 要解决问题: 调大模型, 要用python, 需要numpy安装pip结果是升级了, 对不上当前py版本, 啥都装不了, 需要降级. 想到的思路: https://repo.msys2.org/mingw/clang64/ 下载对应包 使用命令…

oracle-存储结构

文件包括 控制文件.ctl、数据文件.dbf、日志文件.log这三类放在存储上。 参数文件&#xff1a;空间的划分&#xff0c;进程的选用&#xff08;.ora&#xff09; oracle启动的时候需要读一下&#xff0c;数据库启动后&#xff0c;参数文件并不关闭&#xff0c;但即使文件丢了&a…

Python生成器 (Generators in Python)

Generators in Python 文章目录 Generators in PythonIntroduction 导言贯穿全文的几句话为什么 Python 有生成器Generator&#xff1f;如何获得生成器Generator&#xff1f;1. 生成器表达式 Generator Expression2. 使用yield定义生成器Generator 更多Generator应用实例表示无…

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术&#xff08;License Plate Recognition, LPR&#xff09;在交通计算机视觉&#xff08;Computer Vision, CV&#xff09;领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

Day20 222完全二叉树的节点个数 110平衡二叉树 257二叉树的所有路径

222 完全二叉树的结点个数 本题先不把它当成完全二叉树来看&#xff0c;用广度优先和深度优先搜索分别遍历&#xff0c;也能达到目的&#xff0c;只要将之前的代码稍加修改即可。注意后序遍历时的result要加上自身本身的那个结点。 //后序递归遍历 class Solution { public:in…

【AI】人工智能的未来

目录 一、人工智能的未来预测 二、可信人工智能 三、多模态预训练模型 四、基于人工智能的网络安全 五、边缘计算和联合学习 六、人机协作与交互 七、从大数据转向多样化小数据 八、人工智能伦理 一、人工智能的未来预测 从技术的发展角度看&#xff0c;人工智能&…

STL——集合算法

算法简介&#xff1a; set_intersection // 求两个容器的交集set_union // 求两个容器的并集set_difference // 求两个容器的差集 1.set_intersection 函数原型&#xff1a; set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);…

【办公技巧】怎么批量提取文件名到excel

Excel是大家经常用来制作表格的文件&#xff0c;比如输入文件名&#xff0c;如果有大量文件需要输入&#xff0c;用张贴复制或者手动输入的方式还是很费时间的&#xff0c;今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹&#xff0c;选中所有文件&#xff0c…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

SQL进阶:视图的增删改

上一节我们学习了子查询,这一节我们来了解下视图。这俩货很像。 当子查询很复杂,用的地方又多,为了提高重用率,就可以创建为视图。当然了,视图还有其他用处。 视图的用途 简化查询,这个上面已经提到了。 保护数据,可以通过视图来开放给用户指定的列,来缩小访问权限…