线程池大小的选择
2020-06-21 本文已影响0人
修行者12138
任务可以分为CPU密集型任务,IO密集型任务与混合型任务。
对于CPU密集型任务,线程本身可以充分利用CPU,线程池太大反而增加线程切换的开销。
对于IO密集型任务,等待IO的过程中,线程会被挂起,如果线程池定义的太小,大部分线程都被挂起,CPU就得不到充分利用,新的请求过来,也容易没有线程可用。
对于混合型任务,可以把任务分为CPU密集型和IO密集型,然后分别选择线程池。
那么,线程池的大小具体该设置多少呢,需要了解cpu数、核心数、线程数的关系
cpu数是物理概念,指处理器的个数
核心数也是物理概念,一个cpu可以有多个内核
线程数是逻辑概念,
如果是看一个电脑最多能开几个线程,那取决于内存大小,一个线程大约要1M内存,与cpu数和核心数没有关系。
但是是看一个电脑同一时刻能执行几个线程,要看有没有开超线程(HT, Hyper-Threading)
如果没有开超线程,1个单核cpu同一时刻只能执行1个线程,1个n核cpu同一时刻只能执行n个线程。
如果开了超线程(同一个核心可以同时执行2个线程),1个单核cpu同一时刻可以执行2个线程,1个n核cpu同一时刻只能执行n * 2个线程
如果是CPU密集型任务,线程池大小公式:
cpu数 * 核心数 * 2(如果有超线程)
如果是IO密集型或混合型任务,线程池大小大概是上述公式的2-3倍