在关于 stackoverflow 的另一个问题中,我得到一个提示,我可以将线程池用于我的爬虫正在创建的生产者-消费者模式。
但是,我只是不知道如何实现它。
在SO 上的生产者消费者线程中,他们只使用生产者消费者来管理生产者和消费者(在我的情况下,这将是爬虫本身;这与我的 for 循环没有太大区别),但这似乎不是我文章中评论者的意图(因为他看不到我使用了 for 循环)。工作量仍然通过queue
那里共享。
我还考虑过通过这个实现传递一个Website
对象(并从中ExecutorService.submit()
删除):Runnable
Crawler
public class Website implements Runnable {
private URL url;
public Website(URL url) {
this.url = url;
}
@Override
public void run() {
Crawler crawler = new Crawler();
crawler.crawl(url);
}
}
但问题是
- 我认为生成的爬虫太多了
- Crawler() 需要一个已经访问过的网站队列
如何在爬虫问题中正确实现生产者、消费者模式?我对这一切感到完全困惑。我在网上查了很多关于它的网站,而且似乎都以不同的方式使用它。