首页 > 程序人生 > 谈事件驱动模型中的“超时”(Timeout)处理

谈事件驱动模型中的“超时”(Timeout)处理

写在最前面:本文是作者在开发爬虫程序时的一些体会,分享一下,希望能给读者朋友一点点帮助。

通常,在事件驱动模型的程序中,会有一个事件处理模块,我们称之为EventProcessor,还会有一个事件检测模块,我们称之为EventMonitor。下面是一般的处理流程:
(1)EventProcessor在发出对某一个事件的请求后,不会去等待事件结果的返回,而是返回去做其它的工作
(2)当EventMonitor模块收到上述事件的返回结果后的,它就会发消息通知EventProcessor
(3)EventProcessor收到消息后的,开始处理上述事件的结果

举一个爬虫中请求DNS的例子来说明:
(1)EventProcessor向远程的DNS服务器发出获取Url-A对应的Host的IP的请求,此时,EventProcessor不用去一直等待,直到DNS服务器返回结果,而是将Url-A对应的抓取上下文(CrawlContext)的状态置为等待DNS结果的状态,然后继续去做其它的事情,比如处理其它的URL
(2)EventMonitor检测到收到了DNS服务器返回的请求A的IP的结果,于是,EventMonitor就给EventProcessor发消息,通知EventProcessor收到A的IP了
(3)EventProcessor收到了EventMonitor发来的消息,拿到了A的IP,然后就可以开始下一步的工作,比如开始抓取

上面的过程,看上去好像是一个比较完美的过程,但是,细心的读者可能会问这样一个问题,如果DNS服务器长时间不返回结果呢,是不是Url-A就一直处于等待DNS的状态,不能继续进行下一步的处理了?是这样的,因此,需要改进上面的流程。具体的解决方案就是我们今天要讲—–事件的超时(Timeout)处理。

事件的超处理的基本思想就是,当你请求一个事件后,你给它设定一个等待它结果的最长时限,如果在最长时限这段时间内它的结果还没有返回,那么就认为该事件的结果不能返回了,就不用再等待了,可以继续接下来的逻辑的处理了。

在上面的例子中,EventProcessor在发出A的DNS请求的同时,添加一个定时器事件,比如30秒的DNS超时,如果30秒内DNS服务器还没有返回DNS结果,那么就由定时器触发一个DNS超时事件,以消息的方式通知EventProcessor。当EventProcessor收到该消息后,知道A的DNS请求超时了,就不用再等了,可以继续对A进行其它的处理了,比如直接转入抓取失败,结束它的抓取。

以上的解决方案中提到了定时器,今天在这里就不细说定时器了,后续我会写本文的下一篇,详细的谈一谈实现定时器过程中的一些细节。

  1. 2010年3月19日12:27 | #1

    你写了这种程序,可是你对自己网站文章的静态化好像没有处理好。搜索引擎的爬虫遇到链接中的?的时候,有时会忽略掉后面的内容。另外,个人觉得,友情链接的根本目的在于两个字:友情。它在很大程度上不是给记者看的,而给搜索引擎看的。因此,并不是越多越好。原则上首页尽量不要超过20个。并且每周加入的尽量不要超过2个。
    胡乱说了这些,希望不要介意。谢谢

    • 2010年3月19日13:35 | #2

      关于你说的这个问题,你可以到百度,谷歌,搜搜任一一个搜索引擎上去试一下site: http://www.wuzesheng.com,你可以得到答案了。
      事实上互联网上有50%以上的动态页面,如果只是简单的把?后面的参数取掉,那就会有相当大量的页面不会被收录。可以明确的告诉你,搜索引擎在收录页面的时候,在选择一个页面要不要收录,一般不是根据url外形,而是根据页面内容,每个页面都会有一人指纹,如果指纹一样的,才会被排重排掉。当然url的外形也是计算一个页面权重要考虑的因素,但是影响真的很小。
      关于友情链接,只是为了一方面给站点增加入口,另一方面,是为了提高pr值。

      有什么问题欢迎交流!

  1. 2010年3月22日23:28 | #1
  2. 2010年4月18日12:46 | #2
您必须在 登录 后才能发布评论.