一、知识点理解

异步:在一个任务未完成时,就可以执行其他多个任务,彼此不受影响。

同步:一个任务结束后才能启动下一个。

比较:异步执行任务会比同步更节省时间,能减少不必要的等待。

多协程(非抢占式异步技术):一个任务在执行过程中,如果遇到等待,就先去执行其他的任务,当等待结束,再回来继续之前的任务。在计算机的世界中这些任务的回切速度非常迅速,看上去就像多个任务被同时执行一样。

要求:实现多个爬虫同时执行任务,实现异步的爬虫方式。

二、多协程爬虫实现

前提:安装gevent库:pip install gevent -i https://pypi.douban.com/simple

from gevent import monkey  #导入monkey模块
monkey.patch_all()  #patch_all()方法将程序变为异步运行
import gevent, time, requests

简单实现:(创建函数,创建任务,执行所有任务)

1、定义一个爬虫函数(例如:def crawler(url))

2、用gevent.spawn(函数名,函数)函数创建任务(eg:gevent.spawn(crawler, url))

gevent只能处理gevent的任务对象,不能直接调用普通函数,需要借助gevent.spawn()来创建任务对象,参数为要调用的函数名以及被调用的函数的所有参数

3、将所有任务添加到task_list任务列表中,调用gevent.joinall(tasks_list)方法,启动执行所有任务

多窗口排队取号

当需要创建大量任务时,借助queue模块(队列)和协程搭配实现多任务执行,用queue存储任务,协程从队列中将任务提取出来执行,直到队列为空,任务处理完成。

from gevent.queue import queue #导入queue模块
work = Queue()  #创建队列对象,并赋值给work

queue对象常用方法

方法

作用

put_nowait()

向队列中添加数据

get_nowait()

从队列中提取数据

empty()

判断队列是否为空

full()

判断队列是否已满

qsize()

获取队列还剩的存储量

三、扩展内容

并行执行:cpu从单核进化到多核,每个核都能独立运作,能够实现真正意义上同时执行多个任务。

并发执行:多个任务之间来回切换。

多协程:只占用cpu的一个核运行。

多进程:利用cpu的多个核同时执行任务。