0

GitHubでロボット ホスティングという名前のプロジェクトに取り組んでいます。私のプロジェクトの仕事は、xml 構成ファイルから指定された URL からメディアを取得することです。xml 構成ファイルには、scripts dir でわかるように、定義された形式があります。

私の問題は以下の通りです.2つの引数があります:

  1. Web リンクの深さを示すリスト。リスト アイテムのセレクター (css セレクター) に従って、最終的にメディアを見つけることができるメディア URL またはサブページ URL を見つけることができます。
  2. サブページの URL を含む arr。

以下のように単純化された例:

node_list = {..., next = {...,  next= null}};
url_arr = [urls];

URL arrのすべてのアイテムを繰り返したいので、以下のようにします:

function fetch(url, node) {
    if(node == null) 
        return ;
    // here do something with http request
    var req = http.get('www.google.com', function(res){
        var data = '';
        res.on('data', function(chunk) {
            data += chunk;
        }.on('end', function() {
             // maybe here generate more new urls
             // get another url_list
             node = node.next;
             fetch(url_new, node);
        }
}

// here need to be run in sync
for (url in url_arr) {
     fetch(url, node)
}

ご覧のとおり、非同期 http 要求を使用すると、すべてのシステム リソースを消費する必要があります。そして、私はプロセスを制御できません。では、この問題を解決するための良いアイデアはありますか? または、nodejsはそのような仕事をする適切な方法ではありませんか?

4

1 に答える 1

1

同時に取得する HTTP 要求が多すぎることが問題である場合はfetch、URL のスタックで動作するように関数を変更できます。

基本的には次のようにします。

  • が呼び出されたらfetch、URL をスタックに挿入し、リクエストが進行中かどうかを確認します。
  • リクエストが実行されていない場合は、スタックから最初の URL を選択して処理します。それ以外の場合は何もしません
  • http リクエストが終了したら、スタックから新しい URL を取得し、それを処理します。

このようにして、for ループで今のようにすべての URL を追加できますが、一度に処理される URL は 1 つだけなので、リソースがあまり使用されません。

于 2013-07-20T19:28:12.023 に答える