一文带你了解高并发场景下创建多少线程才合适?

161 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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耗时) ]