多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
最关键的一点,多线程可以让同一个程序的不同部分并发执行
如果你用过网际快车你就能理解了 比如文件分成100部分 10个线程 文件就被分成了10份来同时下载 1-10 占一个线程 11-20占一个线程 依次类推 线程越多 文件就被分的越多 同时下载 当然速度也就越快
多线程的用处在于,做某个耗时的操作时,需要等待返回结果,这时用多线程可以提高程序并发程度。如果一个不需要等待的CPU密集的任务,效率提升不明显.但是如果是IO操作比较多,CPU计算比较少,即使是单核CPU,应用了多线程技术后对外也会表现一定性能提升(实质为提高了碎片时间的利用率)
补充
## 为什么我们需要多线程
当遇到`IO`操作时,程序停止运行,等待`IO`操作完成.此时`CPU`闲置(`IO`与`CPU`属于两个独立电路,操作可以独立运行).
为了充分利用`CPU`的闲置时间.我们提出了多线程的概念,当一个线程因为`IO`阻塞时,我们可以出让`CPU`给另外一个线程使用.尽量避免`CPU`空转.
#### 为什么redis要采用单线程的实现方式呢?
redis是一个单线程的应用,为什么在多线程技术如此流行的今天,redis要采用单线程的实现方式呢?
redis的绝大部分操作都是完全基于内存的,所以当它操作数据时`几乎`是不需要等待的.(相对于从磁盘读取数据而言).
这意味着线程不需要读盘,不需要阻塞,CPU不会空转.既然不需要阻塞,那么也就不需要多线程了.没有多线程,自然也就节省下了线程调度及资源竞争的系统开销.
另外上面说到**操作数据时`几乎`是不需要等待的**,我们知道`IO`不仅仅有`磁盘IO`,也涉及到`网络IO`.网络IO也很耗时,也需要等待.这个时候单线程不就会阻塞了吗?
redis为了节省网络IO带来的开销.采用了`多路IO复用`的IO模型.**单单使用一个线程就可以同时监听成千上万个网络链接**(通常只有几百上千个TCP连接是活跃的).
Redis服务采用Reactor的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符,文件事件处理器使用`I/O`多路复用模块同时监听多个FD,
当 `accept`、`read`、`write` 和 `close` 文件事件产生时,文件事件处理器就会回调FD绑定的事件处理器。
虽然整个文件事件处理器是在单线程上运行的,但是通过`I/O`多路复用模块的引入,实现了同时对多个`FD`读写的监控,保障了网络通信的性能.
`redis`的单线程是指处理客户端请求读写数据采用单线程模型,而数据持久化,`rehash`这些非主线操作都是另外起一个线程.
总结来说,`redis`不使用多线程是因为它的两大特点`操作基于内存+多路IO复用`.另外从目前情况而言,`网络带宽`是目前影响redis吞吐量的最大瓶颈,接下来才可能是`CPU`.
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
我百度的,我可不可以理解成,把一个10吨的大卡,换成10辆1吨的小卡来拉货。
一个1吨小货物(一个小程序)大卡拉也是一趟,小卡也是一趟,那么小卡还有9辆可以拉到其他地方去,大卡只能拉一个目的地的货物,不管是半吨还是1吨,拉完这趟再去拉其他地方的货物。
如果只拉一个10吨的,那么大家都一样效率,区别在于多个程序