程序开多少线程合适?需要考虑程序是CDP密集型,还是I/O密集型。
一、CPU密集型程序
一个完整请求,I/O操作可以在很短时间内完成,CPU还有很多运算要处理,也就是说 CPU计算的比例占很大一部分,线程等待时间接近0。
1、单核CPU
单核CPU处理CPU密集型程序,这种情况并不太适合使用多线程。
2、多核CPU
如果是多核CPU处理CPU密集型程序,我们完全可以最大化的利用CPU核心数,应用并发编程来提高效率。CPU 密集型程序的最佳线程数就是:理论上线程数量 = CPU 核数(逻辑)。
但是实际上,数量一般会设置为 CPU 核数(逻辑)+ 1(经验值)。计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。
二、 I/O 密集型程序
与 CPU 密集型程序相对,一个完整请求,CPU运算操作完成之后还有很多 I/O操作要做,也就是说 I/O 操作占比很大部分,等待时间较长。线程等待时间所占比例越高,需要越多线程;线程CPU时间所占比例越高,需要越少线程。
I/O 密集型程序的最佳线程数就是: 最佳线程数 = CPU核心数 (1/CPU利用率) = CPU核心数 (1+ ( I/O耗时 / CPU耗时))。
如果几乎全是 I/O耗时,那么CPU耗时就无限趋近于0,所以纯理论你就可以说是2N(N=CPU核数),一般我们说 2N + 1就即可。