传统的计算机科学强调算法的重要性,好的算法能更有效率的完成计算。但是在当今的很多web应用中,程序大部分时间并不是在计算,而是在进行网络通信,网络延迟大大增加了程序的等待时间,尤其是作为网络服务器要同时与多个客户端建立网络连接,这是非常低效的。目前的一个解决办法是采用异步I/O。
本文会实现一个简单的web爬虫程序,爬虫是一个典型的异步程序,因为它会等待很多网络回复,而只做很少的计算。如果用一个线程去发送一个请求,然后等待返回,那么随着并发请求数量的增多,线程资源很快就会被耗尽,而采用异步I/O将不会出现这个问题。
本文中的爬虫程序包括三部分,第一部分,介绍 async event loop 并用event loop简单写一个带有回调函数的爬虫程序,这个简单的爬虫程序的效率很高,但可扩展性比较差。第二部分,我们用python中的生成器实现一个简单的协程,我们可以看到,python中的协程不仅效率很高,扩展性也很强。第三部分,我们将采用python标准库中的asyncio模块,并增加一个队列来优化爬虫程序。
爬虫程序会访问并下载在一个网站上的所有页面。从一个根URL开始访问,获取一个页面,然后解析这个页面中的URL,然将URL添加到队列当中,然后从队列中拿到URL爬取页面,重复上面的过程,直到队列中没有URL,爬虫程序将会停止。
ff