合理设置线程池大小

要想合理的配置线程池的大小,首先得分析任务的特性,能够从如下几个角度分析:数据库

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

性质不一样的任务能够交给不一样规模的线程池执行。编程

对于不一样性质的任务来讲,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)。最后,业务执行时间长的问题,也可能须要分析一下,看看能不能使用中间件对任务进行拆分和解耦并发

相关文章
相关标签/搜索