开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
前言
相信大家在工作和面试中经常会考虑到一个问题:那就是线程池的大小应该如何进行设置?
这个问题本质上来说,就是我们的应用场景中,需要创建多少个线程合适。一般来说,我们可以将应用程序区分为两种:CPU密集型程序和I/O密集型程序, 而针对于CPU密集型程序和I/O密集型程序,其计算最佳线程数的方法是不同的。
通过本篇文章,我们将介绍计算线程数的方法。
CPU密集型程序
对于CPU密集型计算,多线程本质上是提升多核CPU的利用率,所以对于一个4核的CPU, 每个核一个线程, 理论上创建4个线程 就可以了, 再多创建线程也只是增加线程切换的成本。 所以, 对于CPU密集型的计算场景, 理论上“线程的量=CPU核数”就是最合 适的。 但是在实际工作中, 一般会将线程数量设置为“CPU核数+1”, 这样的话, 当线程因为偶尔的内存页失效或其他原因导致阻塞 时, 这个额外的线程可以顶上, 从而保证CPU的利用率 。
所以,在CPU密集型的程序中,一般可以将线程数设置为CPU核数+1。
I/O密集型程序
对于I/O密集型的程序,最佳的线程数是与程序中CPU计算和I/O操作的耗时比相关。总体来说,可以将其总结为如下的公式。
单核CPU
最佳线程数 = 1 +(I/O耗时 / CPU耗时)
我们令R=I/O耗时 / CPU耗时, 可以这样理解: 当线程A执行IO操作时, 另外R个线程正好执行完各自的CPU计算。 这样CPU的利用
率就达到了100%。
多核CPU
多核CPU的最佳线程数在单核CPU最佳线程数的基础上,乘以CPU核数即可,如下所示。 最佳线程数=CPU核数 * [ 1 +(I/O耗时 / CPU耗时) ]