多线程分析
怎么使用多线程?我们必须先从什么情况下能用多线程,什么情况下不能用多线程说起。
多线程不能做什么
常见的多线程模型,对于每个处理任务建立一个线程去处理,即Request Per Thread
这个传统的多线程模型可以针对3个场景出现的问题:
1. 对于每个连接建立一个线程
这个模型,建立的线程数即连接数会受到操作系统的进程空间限制,创建的连接个数也会有限制。
2. 对于计算密集型,每个计算建立一个线程
线程如果超过了CPU同时并行运行的数量时,线程之间的上下文切换的开销将会加大,吞吐量则会下降。
3. 如果对于IO密集型,则完全没有必要用多线程,使用多线程只会使线程同时阻塞在IO上
多线程的合理场景
多线程适合既有CPU操作,又有IO操作的场景
对于线程可以分为三类:
- IO线程,专门负责处理IO的操作线程可以允许IO阻塞的读写操作
- 计算线程,只处理CPU和内存之间的计算任务,不做任何与IO相关的阻塞操作
- 控制线程,使用epoll原语处理IO事件,协调IO线程和计算线程之间的同步和异步操作
常规的模型:使用专用处理用户请求的IO线程去处理高并发的用户请求,把请求通过队列的形式进行保存,用适合CPU并行数量的线程池从队列里获取请求去执行,最后如果需要进行本地IO读写,则需要使用单独的IO线程去读写本地文件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。