谈事件驱动模型中的“超时”(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进行其它的处理了,比如直接转入抓取失败,结束它的抓取。

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

你可能感兴趣的:(多线程编程)