四、为什么要多线程
按照上面的说法,有线程的上下文切换耗时,那么为什么需要多线程呢?小伙伴会不会感觉很乱,怎么回事?
小伙伴想想在我们真实业务中,我们是什么流程?
上图的流程:
1、先发起网络请求
2、web服务器解析请求
3、请求后端的数据库获取数据
4、获取数据后,进行处理
5、把处理结果放回给用户
这个是我们处理业务的时候,常规的请求流程;我们看一下整个过程涉及到什么计算机处理。
1、网络请求----->网络IO
2、解析请求----->CPU
3、请求数据库----->网络IO
4、mysql查询数据----->磁盘IO
5、mysql返回数据----->网络IO
6、数据处理----->CPU
7、返回数据给用户----->网络IO
小伙伴们是不是感觉又不乱了,在真实业务中我们不单单会涉及cpu计算,还有网络IO和磁盘IO处理,这些处理是非常耗时的。如果一个线程整个流程是上图的流程,真正涉及到CPU的只有2个节点,其他的节点都是IO处理,那么线程在做IO处理的时候,CPU就空闲出来了,CPU的利用率就不高。
小伙伴们现在知道多线程的用处了吧,对,就是为了提升CPU利用率
七、基础常规标准
那我们小伙伴们会问,因为很多业务集中到一个线程池中,不像上面的案例比较简单,事实上业务太多,怎么设置呢?这个就是要去压力测试去调整。不过我们的前辈已经帮我们总结了一个基础的值(最终还是要看运行情况自行调整)
CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 CPU核数*2。核数为4的话,一般设置 5 或 8
IO密集型:文件操作,网络操作,数据库操作,一般线程设置为:cpu核数 / (1-0.9),核数为4的话,一般设置 40
八、总结
今天介绍了线程数大小的设置,一些小伙伴们的误区。讲到这里我们小伙伴们是不是对线程有了更新的理解,不像之前那么粗暴,应该要去分析为什么这么慢,系统的瓶颈出现在什么地方,减少瓶颈的耗时。
老顾可以推荐小伙伴们再去看一下redis、nginx;为什么他们会那么快呢?其实和这篇文章的知识点有共同的地方。谢谢阅读!!!