本项目核心部分来自《500 lines or less 项目》,原作者是Mongodb的工程师A. Jess Jiryu Davis 与Python之父Guido van Rossum,项目代码使用MIT协议
传统计算机科学往往将大量精力房子啊如何追求更有效率的算法上,但如今大部分的涉及网络的程序,他们的时间开销主要是在维持多个socket连接上,亦或是它们的时间循环处理不够高效导致了更多的时间开销。
对于这些程序来说,他们面临的挑战是如何更高效地等待大量的网络时间进行并行调度。目前比较流行的方法就是异步IO
thready.py
自定义线程池并发爬虫thready2.py
内置电池线程池并发爬虫callback.py
非阻塞事件循环爬虫coroutine.py
事件循环协程爬虫
我们希望通过并发执行来加快爬虫抓取页面的速度,一般实现方式有三种
- 线程池方式:开一个线程池,没发现一个新链接就将链接放入任务队列中,线程池中的线程从任务队列获取一个链接,之后建立socket,完成抓取页面、解析、将新链接放入工作队列的步骤
- 回调方式:程序会有一个主循环叫时间循环,在实践循环中会不断获得事件,通过在事件上注册解除回调函数k来达到多任务的并发效果。缺点是任务一旦需要的回调较多代码就会非常散难以维护
- 协程方式:同样通过时间循环,利用生成器特性,generator能在中途停止之后恢复,那么原本不得不分开写的回调函数就可以写在一个generator里了