python爬虫学习结合多进程、多线程 | 青训营笔记

209 阅读3分钟

这是我参与[第四届青训营]笔记创作活动的第5天
通过之前学习的单线程爬虫,每次都是请求第一个页面--》得到返回数据--》解析数据--》提取、存储数据,然后再请求第二个页面,依次循环直到执行完毕。这样大部分的时间都浪费在了请求和返回数据上。我在查阅资料的过程中发现,多进程和多线程等方法可以并行运行,提高效率。

串行、并行和并发

这是多进程多线程的运行的基本的思想。

image.png

串行

串行就是按顺序执行。在计算机中,同一时刻,只能有一条指令,在一个CPU上执行,后面的指令必须等到前面指令执行完毕才能执行。

并行

并行就是同事执行。在计算机中,同一时刻,有多条指令,在多个CPU上执行,就是并行。并行的速度优于串行。
多进程是实现并行的有效方法。它可以将许多任务分配到计算机的多个核心上。多进程很适合计算密集型的任务,因为它充分地利用了多个CPU。

并发

并发是比并行更加宽泛的概念,它指的是,多个任务可以交叉重叠进行。
多线程是实现并发的一个手段。一个进程可以拥有多个线程。当有多个cpu时,多个线程是可以同时执行的,这时就是并行。如果只有一个cpu,那么多个线程可以交叉重叠执行,这时就是并发了。

多线程多进程和协程异步

多线程多进程实现如图左所示,协程异步如图右所示。

image.png

多线程

多线程就是指一个进程中同时有多个线程正在执行。

多进程和进程池

多进程

多进程将多个任务分配到不同的cpu上,从而实现同一时刻,处理多个任务。它很适合计算密集的任务。

进程池

可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。 如图所示:

协程异步

异步爬虫不同于多进程爬虫,它使用单线程(即仅创建一个事件循环,然后把所有任务添加到事件循环中)就能并发处理多任务。在轮询到某个任务后,当遇到耗时操作(如请求URL)时,挂起该任务并进行下一个任务,当之前被挂起的任务更新了状态(如获得了网页响应),则被唤醒,程序继续从上次挂起的地方运行下去。极大的减少了中间不必要的等待时间。

案例

定义爬取公司信息的spider image.png 进程池

image.png 协程异步

image.png

总结

对于各种方法的原理掌握的不是很清楚,还需要进一步加强,继续使用多进程实现案例中公司信息的爬取。