想要正确地设置线程池大小,需要分析计算环境、资源预算和分析任务的特性等,防止线程池设置过大或者过小。
一般来说,对于计算密集型(CPU密集型)任务,拥有N个处理器的系统上,当线程池大小为N+1时,通常能实现最优的利用率。多出来的额外的一条线程,可以保证偶尔出现故障时,CPU的时钟周期仍旧不会被浪费掉。
对于包含IO操作或者其他阻塞任务的操作(IO密集型),由于线程不会一直执行,因此线程池规模应该更大。具体需要估算出任务的等待时间与计算时间的比值C(C>0),假如在拥有N个处理器的系统上,CPU的目标使用率为U(U在[0, 1]集合中)。则线程数n,根据公式n=N*U*C计算。显然,线程池大小不是由CPU周期唯一条件确定的,还可能包含内存等其他资源的影响,计算每个任务对资源的需求量,然后用该资源的可用总量除以这个需求量,所得的结果就是线程池大小的上限。另外,如果任务需要通过某种资源池来管理资源,那么线程池大小也会受到资源池大小的影响。
所以,对于线程池大小的设置,一般原则,N个处理器的系统上,计算密集型(CPU密集型)为N+1,IO密集型尽可能更大一些。
网友评论