协程是轻量级线程,多个协程下的任务遇到 I/O 操作后由程序自主切换任务,而线程切换是操作系统完成的。
gevent就是协程的实现库
gevent 初探: 提高爬虫效率
问题定义: 使用gevent提高爬虫请求效率
from gevent import monkey; monkey.patch_all()
import gevent
import requests
def f(url):
print('GET: %s' % url)
res = requests.get(url)
print(res)
gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'), #创建协程, 第一个参数是要执行的任务函数,之后的参数是函数的参数
gevent.spawn(f, 'https://www.yahoo.com/'),
gevent.spawn(f, 'https://github.com/'),
])
运行结果如下:
GET: https://www.python.org/
GET: https://www.yahoo.com/
GET: https://github.com/
<Response [200]>
<Response [200]>
<Response [200]>
可看出程序并非是串行的,而requests请求是同步的,即一个请求发出到获取响应这段时间一直处于等待,当有响应之后,再发出第一个请求,如果想要提高requests 请求的效率,可以结合gevent来实现