4.2 加速爬虫: 异步加载 Asyncio

原理: 在单线程里使用异步计算, 下载网页的时候和处理网页的时候是不连续的, 更有效利用了等待下载的这段时间

传统的单线程下载处理网页就像下图(来源)左边蓝色那样, 计算机执行一些代码, 然后等待下载网页, 下好以后, 再执行一些代码… 或者在等待的时候,用另外一个线程执行其他的代码, 这是多线程的手段.

asyncio就像右边,只使用一个线程,但是将这些等待时间统统掐掉,下载都调到后台,这个时间里,执行其他异步的功能,下载好了之后,再调回来接着往下执行

asyncio是一个线程,是在 Python 的功能间切换着执行. 切换的点用await来标记, 能够异步的功能用async标记, 比如async def function():

使用 asyncio 的形式, job 1 在等待 time.sleep(t) 结束的时候, 比如是等待一个网页的下载成功, 在这个地方是可以切换给 job 2, 让它开始执行.

job 1 触发了 await 的时候就切换到了 job 2 了. 这时, job 1 和 job 2 同时在等待 await asyncio.sleep(t), 所以最终的程序完成时间, 取决于等待最长的 t, 也就是 2秒

aiohttp

和多进程分布式爬虫对比

asyncio :解析网页还是用的和 multiprocessing 一样的并行处理, 因为asyncio 不支持解析网页的异步, 毕竟是计算密集型工序.

在下载网页时, 不用 multiprocessing, 改用 asyncio, 用一个单线程的东西挑战多进程.

Number of Process

Multiprocessing

Asyncio

2

25.5s

7.5s

4

15.4s

7.0s

8

11.5s

7.2s

Last updated

Was this helpful?