多线程

我们知道,在一台计算机中,我们可以同时打开许多软件,比如同时浏览网页,听音乐,打字等等,看似非常正常。但是仔细想想,为什么计算机可以做到这么多软件同时运行呢?这就涉及到计算机中的两个重要概念:多进程和多线程了。

多线程的含义

说起多线程,就不得不先说什么是线程。想要弄明白什么是线程,又不得不先说什么是进程。

进程我们可以理解为是一个可以独立运行的程序单位,比如打开了一个浏览器,这就开启了一个浏览器进程;打开了一个文本编辑器,这就开启了一个文本编辑器的进程。但是一个进程中是可以同时处理很多事情的,比如在浏览器中,我们可以在多个选项卡中打开多个界面,有的界面播放声音,有的界面播放视频,它们可以同时运行,互不干扰。其实这一个个任务,实际上就对应着一个个线程的执行。

而进程呢?它就是线程的集合,进程就是由一个或者多个线程构成的,线程是操作系统进行运算调度的最小单位,是进程中的一个最小运行单元。比如上边所有的浏览器进程,其中播放音乐就是一个线程,播放视频也是一个线程,当然其中还有很多其它的线程在同时运行,这些线程的并发或并行执行最后使得整个浏览器可以同时运行这么多的任务。

了解了线程的概念,多线程就很容易理解了,多线程就是一个进程中同时运行多个线程,前面所说的浏览器的情景就是典型的多线程执行。

多线程的适用场景

在一个程序进程中,有一些操作是比较耗时或者需要等待的,如果等待网页结果的响应,等到数据库的查询结果的返回。如果使用单线程,处理器必须要等到这些操作完成之后才能继续往下执行其它操作,而这个线程在等待的过程中,处理器明显是可以执行其它操作的。如果使用多线程,处理器就可以在某个线程等待的时候,去执行其它的线程,从而整体上提高执行效率。

像上述场景,线程在执行过程中很多情况下是需要等待的。比如网络爬虫就是一个非常典型的例子,爬虫在向服务器发起请求之后,有一段时间必须要等待服务器的响应返回,这种任务就属于 IO密集型任务。对于这种任务,如果我们启用多线程,处理器就可以在某个线程等待的过程中去处理其它的任务,从而提高整体的爬取效率。

但并不是所有的任务都是 IO密集型任务,还有一种任务叫做计算密集型任务,也可以称之为 CPU密集型任务。顾名思义,就是任务的运行一直需要处理器的参与。此时如果我们开启了多线程,一个处理器从一个计算密集型任务切换到另一个计算密集型任务上去,处理器依然不会停下来,始终会忙于计算,这样并不会节省总体的时间,因为需要处理的任务的计算总量是不变的。如果线程数量过多,反而还会在线程切换的过程中多消耗一些时间,整体效率会变低。

所以,如果任务不全是计算密集型任务,我们可以使用多线程来提高程序整体的执行效率。尤其对于网络爬虫这种 IO密集型任务来说,使用多线程会大大提高程序整体的爬取效率。