3

これが私のコードです:

データベースに500,000を超えるレコードがあり、ループして別のサーバーに情報を要求したいと思います。各リクエスト間の遅延を除いて、すべての関数を正常に作成しました。node.jsですべてのリクエストを送信すると、リモートサーバーがダウンするか、各リクエストに応答できなくなります。したがって、ループするキューを作成する必要がありますが、コードが機能せず、すべてのリクエストを非常に高速に送信しています。

var http = require('http')
, mysql = require('mysql');
var querystring = require('querystring');
var fs = require('fs');
var url  = require('url');


var client = mysql.createClient({
    user: 'root',
    password: ''
});

client.useDatabase('database');
client.query("SELECT * from datatable",
    function(err, results, fields) {
        if (err) throw err;
        for (var index in results) {
            username = results[index].username;
            setInterval(function() {

                requestinfo(username);
            }, 5000 );

        }
    }
    );
client.end();
}
4

1 に答える 1

6

すべてのリクエストを 5 秒ごとにオフにするように設定したため、問題は for ループにあります。つまり、5 秒後にすべてのリクエストが比較的同時に起動されます。これは setInterval で行われるため、5 秒ごとに発生します。

2つの方法で解決できます。

最初の選択肢は、インデックスが数値の場合、5 秒ごとに新しいリクエストを作成する間隔を設定することです。そのため、for ループの代わりに次のようにします。

    var index = 0;
    setInterval(function(){
      requestinfo(results[index].username);
      index++;
    }, 5000)

2 番目の選択肢は、すべてのリクエストのタイムアウトを長く設定して、現在のスクリプトを次のように変更することです。

    var timeout = 0;
    for (var index in results) {
        username = results[index].username;
        setTimeout(function() {
            requestinfo(username);
        }, timeout );
        timeout += 5000;
    }

これにより、0、5、10、15 秒などのタイムアウトが設定されるため、5 秒ごとに新しいリクエストが発行されます。

于 2012-09-20T09:17:17.533 に答える