WEB开发网
开发学院软件开发C语言 适合C# Actor的消息执行方式(5):一个简单的网络... 阅读

适合C# Actor的消息执行方式(5):一个简单的网络爬虫

 2010-09-30 20:50:14 来源:WEB开发网   
核心提示: Monitor要处理的自然是ICrawlResponseHandler中的Succeeded或Failed方法:voidICrawlResponseHandler.Succeeded(Crawlercrawler,stringurl,List<string>links){Consol

Monitor要处理的自然是ICrawlResponseHandler中的Succeeded或Failed方法:

void ICrawlResponseHandler.Succeeded(Crawler crawler, string url, List<string> links) 
{ 
  Console.WriteLine("{0} crawled, {1} link(s).", url, links.Count); 
 
  foreach (var newUrl in links) 
  { 
    if (!this.m_allUrls.Contains(newUrl)) 
    { 
      this.m_allUrls.Add(newUrl); 
      this.m_readyToCrawl.Enqueue(newUrl); 
    } 
  } 
 
  this.DispatchCrawlingTasks(crawler); 
} 
 
void ICrawlResponseHandler.Failed(Crawler crawler, string url, Exception ex) 
{ 
  Console.WriteLine("{0} error occurred: {1}.", url, ex.Message); 
  this.DispatchCrawlingTasks(crawler); 
} 

在抓取成功时,Monitor将遍历links列表中的所有地址,如果发现新的url,则加入相关集合中。在抓取失败的情况下,我们也只是简单的继续下去而已。而“继续”则是由DispatchCrawlingTasks方法实现的,我们需要传入一个“可复用”的Crawler对象:

private void DispatchCrawlingTasks(Crawler reusableCrawler) 
{ 
  if (this.m_readyToCrawl.Count <= 0) 
  { 
    this.WorkingCrawlerCount--; 
    return; 
  } 
 
  var url = this.m_readyToCrawl.Dequeue(); 
  reusableCrawler.Post(c => c.Crawl(this, url)); 
 
  while (this.m_readyToCrawl.Count > 0 && 
    this.WorkingCrawlerCount < this.MaxCrawlerCount) 
  { 
    var newUrl = this.m_readyToCrawl.Dequeue(); 
    new Crawler().Post(c => c.Crawl(this, newUrl)); 
 
    this.WorkingCrawlerCount++; 
  } 
} 

上一页  1 2 3 4 5 6  下一页

Tags:适合 Actor 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接