0

stackoverflowに関する別の質問で、クローラーが作成している生産者/消費者パターンにスレッドプールを使用できるというヒントを得ました。

しかし、私はそれを実装する方法を見つけることができません。

SOのプロデューサーコンシューマースレッドでは、プロデューサーコンシューマーを使用してプロデューサーとコンシューマーを管理します(私の場合はクローラー自体です。これは私のforループとそれほど変わりません)が、これは私の記事のコメント投稿者の意図(彼は私がforループを使用しているのを見ることができなかったので)。ワークロードはまだqueueそこを介して共有されます。

また、この実装でオブジェクト渡すことWebsite(およびからExecutorService.submit()削除すること)についても考えました。RunnableCrawler

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);
    }
}

しかし、問題はそれです

  1. 生成されているクローラーが多すぎると思います
  2. Crawler()は、すでにアクセスしたWebサイトのキューを想定しています

クローラーの問題にプロデューサー、コンシューマーパターンを適切に実装するにはどうすればよいですか?私はそれについて完全に混乱しています。私はウェブ上でそれについて非常に多くのウェブサイトをチェックしました、そしてすべてがそれを異なって使用しているようです。

4

1 に答える 1

0

理解するためにはもっとコードを見る必要があると思います。
ただし、プロデューサー-コンシューマーにするためにできることは、クローラークラスをコンシューマーに
し、コードでエグゼキューターをコンシューマーとして使用することです。
クローラーは、プロデューサーとコンシューマーの間のキューまたはその他の共有データ構造(同期データ構造)からWebSiteのオブジェクトを取得します。
データ構造を選択するときに自問すべきことは、次の質問のいくつかです
-A.クロールするサイト間に優先順位はありますか?その場合は、 PriorityBlockingQueue
の使用を検討してください。 B.クロールの順序は重要ですが、すべての優先順位は同じですか? もしそうなら-LinkedBlockingQueueの使用を検討してください




C.リンクをなんとかして分類できますか?
もしそうなら、多分あなたはそれらへのカテゴリーのマップで、いくつかの共有データ構造を持つことができます。

この共有データ構造を自分で構築する方法について、多くのアイデアを思いつくことができると確信しています。これらは私の考えにすぎません。


結論として
-1.CrawlerにRunnableを拡張させます2.Crawler
に共有データ構造(つまり、ブロッキングキュー)から「ジョブ」(WebSiteクラス)を抽出させます。
3.エグゼキュータを使用する前に、プロデューサに共有データ構造にジョブを配置してもらいます。

于 2012-07-14T20:54:01.197 に答える