关于python3的ThreadPoolExecutor线程池大小设置

作者:whatday 时间:2023-12-05 13:37:57 

线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。

线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能耗尽资源。如果线程池过小,那么将导致许多空闲处理器无法执行任务,降低了系统吞吐率。

要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:

任务的性质:CPU密集型任务、IO密集型任务、混合型任务。
任务的优先级:高、中、低。
任务的执行时间:长、中、短。
任务的依赖性:是否依赖其他系统资源,如数据库连接等。

性质不同的任务可以交给不同规模的线程池执行。

对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。

若任务对其他系统资源有依赖,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。

当然具体合理线程池值大小,需要结合系统实际情况,在大量的尝试下比较才能得出,以上只是前人总结的规律。

在这篇如何合理地估算线程池大小?有一个估算合理值的公式

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。

这个公式进一步转化为:

最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

可以得出一个结论:

线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。 以上公式与之前的CPU和IO密集型任务设置线程数基本吻合。

并发编程网上的一个问题

高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

  1. 高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换

  2. 并发不高、任务执行时间长的业务要区分开看:

    1. 假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务

    2. 假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换

  3. 并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦

来源:https://blog.csdn.net/whatday/article/details/106732059

标签:ThreadPoolExecutor,线程池
0
投稿

猜你喜欢

  • 教你如何在SQL Server数据库中加密数据

    2009-09-10 14:49:00
  • Python实现数据地址实体抽取

    2022-12-03 00:23:18
  • Python3 log10()函数简单用法

    2021-06-27 16:47:16
  • Linux CentOS7下安装python3 的方法

    2023-09-17 03:40:08
  • 深入解析MySQL的事务隔离及其对性能产生的影响

    2024-01-27 11:17:07
  • python+selenium开发环境搭建图文教程

    2022-10-17 13:04:05
  • Python中的装饰器使用

    2023-05-25 13:14:09
  • 详解Vue2 SSR 缓存 Api 数据

    2023-07-02 17:09:06
  • 如何利用Python和matplotlib更改纵横坐标刻度颜色

    2022-06-02 04:00:03
  • sqlserver中获取月份的天数的方法分享

    2011-09-30 11:27:52
  • Python unittest框架操作实例解析

    2023-06-12 14:14:57
  • python实现文本进度条 程序进度条 加载进度条 单行刷新功能

    2021-04-06 09:29:53
  • 垂直无缝滚动图片(兼容性好)实例教程源码下载

    2010-04-06 12:16:00
  • Django项目使用CircleCI的方法示例

    2022-10-17 11:43:24
  • 学习Python中一些实用的库

    2022-11-02 13:55:56
  • 分享8 个常用pandas的 index设置

    2023-10-24 14:22:13
  • Python中模块string.py详解

    2021-05-20 05:25:03
  • 使用OpenCV实现仿射变换—旋转功能

    2021-01-20 05:57:48
  • 一文详解pygame.sprite的精灵碰撞

    2022-08-13 23:09:11
  • JS字符串转GBK编码超精简实现详解

    2024-04-28 09:43:13
  • asp之家 网络编程 m.aspxhome.com