线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的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)并发不高、任务执行时间长的业务要区分开看:
  a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务
  b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
  
(3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦

python3 ThreadPoolExecutor 线程池大小设置相关推荐

  1. 线程池大小设置和CPU核心数的关系

    文章目录 1.线程池和CPU核心数的关系 2.常见概念:CPU的核心数,CPU的线程数 3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验 ...

  2. 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

    线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...

  3. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  4. ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

    前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolS ...

  5. ThreadPoolExecutor线程池参数设置

    一.ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处 ...

  6. mysql 线程池大小设置_MySQL线程池参数解析

    线程池是数据库系统非常重要功能,然而MySQL社区版并不包含线程池功能,不过好在MySQL的Percona发行版本提供了这个功能,除此之外,MySQL的企业版也提供线程池,从性价比上说,Percona ...

  7. java io密集型任务_IO密集型的线程池大小设置

    类型判断(CPU密集orIO密集or混合型) 看应用是CPU密集型的还是IO密集型的,还是混合型的. CPU密集 CPU密集型的话,一般配置CPU处理器个数+/-1个线程,所谓CPU密集型就是指系统大 ...

  8. 如何合理地估算线程池大小?

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:蒋小强 , ifeve.com/how-to-calculate-threadpool-si ...

  9. ThreadPoolExecutor线程池的使用

    Java并发编程:线程池的使用 以下是本文的目录大纲: 一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 若有不正之处请多 ...

最新文章

  1. .Net SqlDbHelper
  2. matplotlib.pyplot.plot 用法详解
  3. 精品软件 推荐 百度杀毒 软件
  4. 创业的和想拿高薪的朋友可以看看,企业安全进行云平台运营的5个关键因素
  5. c# WinForm英雄联盟挂机源码及实现原理
  6. 49、剑指offer--把字符串转换成整数
  7. VSCode自定义代码片段3——url大全
  8. 有放回采样和无放回采样
  9. 深入解读Linux进程调度系列——数据结构解析
  10. oracle orderby多个字段,Oracle Order By用法详解
  11. 【- Flutter 桌面篇 -】 FlutterUnit win版闪亮登场
  12. 掌握这几款高保真设计软件,百万年薪不再是梦想
  13. Pixel2Mesh-Tensorflow2
  14. 孔洞填充及连通分量提取
  15. IOS sqlite3 使用简单介绍 使用简单介绍
  16. C# 校验类(邮箱、手机号、身份证号等)
  17. Android--热修复,补丁实战
  18. neo4j ogm_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体
  19. 【收藏】数据分析必会的Excel高频函数合集
  20. 浅析智能化指挥信息系统发展

热门文章

  1. MATLAB红色分量图如何合成,如何修改一张图片中红色分量的值?
  2. python绘制动点_Python asyncore / asynchat 基本传输实验 - Jacky Liu's Blog
  3. Docker 容器技术 — 容器存储
  4. STM32堆栈大小及位置
  5. stm32通用定时器的PWM输出
  6. 【转】清理Visual Studio打开的项目和文件、查找和最近引用组件痕迹
  7. Google机器人眼里的百度
  8. Jquery Ajax调用aspx页面方法
  9. ha-2:read-project-properties (default) on project
  10. openwrt使用3G上网卡