第一章 爬虫基础概念 1.5多线程和多进程的基本原理

目录

1.5  多线程和多进程的基本原理

1.多线程的含义

2.并发和并行

3.多线程适用场景

4.多进程的意义

5. Python中的多线程和多进程


1.5  多线程和多进程的基本原理

        编写爬虫程序时,为了提高爬取效率,需要同时运行多个爬虫任务,其中就涉及多进程和多线程任务。

1.多线程的含义

        进程是CPU以及计算机资源分配和调度的单位,可以理解为一个可以独立运行的程序,例如打开一个浏览器,就开启了一个浏览器进程;打开一个文本编辑器,就开启了一个文本编辑器进程。在一个进程中,可以同时处理很多事情,例如在浏览器进程中,可以在多个选项卡中打开多个页面,不同页面所执行的任务可以同时运行,互不干扰,其中一个任务就对应一个线程。

        进程就是线程的集合,进程由一个或多个线程构成;线程是操作系统进行运算调度的最小单位,线程从属于一个进程。以浏览器进程为例,打开的多个页面中,播放音乐的页面就是一个线程, 播放视频的页面也是一个线程。当然,浏览器进程中还有很多其他线程在同时运行,这些线程并发或并行执行使得整个浏览器可以同时运行多个任务。
        多线程就是一个进程中同时执行多个线程,上面的浏览器进程就是典型的多线程。

2.并发和并行

        在计算机中运行一个程序,底层是通过处理器运行一条条指令来实现的。处理器同一时刻只能执行一条指令,并发(concurrency)是指多个线程对应的多条指令被快速轮换地执行。

        处理器执行指令的速度和切换线程的速度都非常快,人完全感知不到计算机在这个过程中还切换了多个线程的上下文,这使得多个线程从宏观上看起来是同时在运行。从微观上看,处理器连续不断地在多个线程之间切换和执行,每个线程的执行都一定会占用这个处理器的一个时间片段,因此同一时刻其实只有一个线程被执行。

        并行(parallel)指同一时刻有多条指令在多个处理器上同时执行,并行必须依赖多个处理器。并行只能存在于多处理器系统中,如果计算机处理器只有一个核,就不可能实现并行。而并发在单处理器和多处理器系统中都可以存在,因为仅靠一个核, 就可以实现并发。

3.多线程适用场景

        在一个程序的进程中,部分操作是比较耗时或者需要等待的,如等待数据库查询结果的返回、等待网页的响应。这时如果使用单线程,处理器必须等这些操作完成之后才能继续执行其他操作。如果使用多线程,处理器就可以在某个线程处于等待态的时候,去执行其他线程,从而提高整体的执行效率。
        爬虫在向服务器发起请求之后,有一段时间必须等待服务器返回响应,这种任务就属于I/O密集型任务。对于这种任务,如果我们启用多线程,那么处理器就可以在某个线程等待的时候去处理其他线程,从而提高整体的爬取效率。但并不是所有任务都属于I/O密集型任务,还有一种任务叫作计算密集型任务,也可以称为CPU密集型任务。顾名思义,就是任务的运行一直需要处理器的参与。假设我们开启了多线程,处理器从一个计算密集型任务切换到另一个计算密集型任务,那么处理器将始终忙于计算,由于计算总量不变,这样并不会节省整体的时间。此时如果线程数目过多,反而还会在线程切换的过程中耗费更多时间,使得整体效率变低。
        综上所述,如果任务不全是计算密集型任务,就可以使用多线程来提高程序整体的执行效率。尤其对于网络爬虫这种
I/O密集型任务,使用多线程能够大大提高程序整体的爬取效率

4.多进程的意义

        进程( process)是系统进行资源分配和调度的一个独立单位。由于进程就是线程的集合,而且进程是由一个或多个线程构成的,所以多进程意味着有大于等于进程数量的线程在同时运行。

5. Python中的多线程和多进程

        Python中GIL的限制导致不论是在单核还是多核条件下,同一时刻都只能运行一个线程,这使得Python多线程无法发挥多核并行的优势。GIL(Global Interpreter Lock)是全局解释器锁,其设计之初是出于对数据安全的考虑。在Python多线程下,每个线程的执行方式严格按照以下三步:1.获取GIL;2.执行对应线程的代码;3.释放GIL。线程执行之前,必须先拿到GIL。因此,GIL相当于通行证,并且在一个Python进程中只有一个GIL

        这样会导致即使在多核条件下,一个Python进程中的多个线程在同一时刻也只能被执行一个。而对于多进程来说,每个进程都有属于自己的GIL,所以在多核处理器下,多进程的运行不受GIL影响。也就是说,多进程能够更好地发挥多核优势
        对于爬虫这种I/O密集型任务来说,多线程和多进程产生的影响差别并不大。但对于计算密集型任务来说,由于GIL的限制,Python
多线程的整体运行效率可能多核低于单核;而Python的多进程运行效率在多核情况下比单核会有成倍提升

        总而言之,Python 的多进程比多线程更有优势。所以,如果条件允许的话,尽量用多进程。值得注意的是,由于进程是系统进行资源分配和调度的一个独立单位,所以各进程之间的数据无法共享的,如多个进程无法共享一个全局变量,进程之间的数据共享需要由单独的机制来实现。关于Python中多进程和多线程的具体用法不再展开介绍,请通过以下链接进行学习:


 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值