
以下是插入一个事件的例子,为了简单,这个例子在ui线程中被执行,实际上,插入和更新处理应该在一个后台的线程中异步的执行。说着林云兒咳嗽一声,正襟危坐道:“首先,我们在荒岛的一个山洞里,其次,我跟你都是被人救的,最后,暂时我们还没能力离开这个荒岛,所以你就安心休养吧。
假设有一个这样的场景,我们需要抓取一个人的博客,我们知道这个人的博客有两个页面,一个list.php页面显示的是此博客的所有文章链接,还有一个view.php页面显示的是一篇文章的具体内容。
如果我们要把这个人的博客里面所有文章内容抓取下来,编写单线程爬虫的思路是:先用正则表达式把这个list.php页面的所有链接a标签的href属性抓取下来,存入一个名字叫做article_list的数组(在python中不叫数组,叫做list,中文名列表),然后再用一个for循环遍历这个article_list数组,用各种抓取网页内容的函数把内容抓取下来然后存入。
如果我们要编写一个多线程爬虫来完成这个任务的话,就假设我们的程序用10个线程把,那么我们就要想办法把之前抓取的article_list平均分成10份,分别把每一份分配给其中一个子线程。
但是问题来了,如果我们的article_list数组长度不是10的倍数,也就是文章数量并不是10的整数倍,那么最后一个线程就会比别的线程少分配到一些任务,那么它将会更快的结束。
如果仅仅是抓取这种只有几千字的博客文章这看似没什么问题,但是如果我们一个任务(不一定是抓取网页的任务,有可能是数学计算,或者图形渲染等等耗时任务)的运行时间很长,那么这将造成极大地资源和时间浪费。我们多线程的目的就是尽可能的利用一切计算资源并且计算时间,所以我们要想办法让任务能够更加科学合理的分配。
并且我还要考虑一种情况,就是文章数量很大的情况下,我们要既能快速抓取到文章内容,又能尽快的看到我们已经抓取到的内容,这种需求在很多CMS采集站上经常会体现出来。
比如说我们现在要抓取的目标博客,有几千万篇文章,通常这种情况下博客都会做分页处理,那么我们如果按照上面的传统思路先抓取完list.php的所有页面起码就要几个小时甚至几天,老板如果希望你能够尽快显示出抓取内容,并且尽快将已经抓取到的内容展现到我们的CMS采集站上,那么我们就要实现一边抓取list.php并且把已经抓取到的数据丢入一个article_list数组,一边用另一个线程从article_list数组中提取已经抓取到的文章URL地址,然后这个线程再去对应的URL地址中用正则表达式取到博客文章内容。如何实现这个功能呢?
我们就需要同时开启两类线程,一类线程专门负责抓取list.php中的url然后丢入article_list数组,另外一类线程专门负责从article_list中提取出url然后从对应的view.php页面中抓取出对应的博客内容。
在gfs的论文中,对于分布式文件系统的读写场景有一个重要的假定(其实是从实际业务角度得来的...):就是文件的读取是由大数据量的连续读取和小数据量的随机读取组成,文件的写入则基本上都是批量的追加写,和偶尔的插入写(gfs中还有大量的假设,它们构成了分布式文件系统架构设计的基石。相对早期的版本,新版本通过对软件系统优化,对于涉及读取以及加载或写入数据的操作,可将运算拆分到多个处理器内核上,当第一个进程开始读取一部分数据后,第二个进程便可立即开始加载或写入该数据,从而大大提升系统的响应速度,也能更好地满足大并发应用需求。例如下面代码,即使写入需要2s,接下来的读取任务也会等待写入完毕,才再读取。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-93939-3.html
希望能武统
不过