async.parallel用于大量函数

时间:2015-10-30 18:25:44

标签: node.js node-async

我有一个功能,我想拨打100万次。该函数对数据库进行两次调用(首先是SELECT,然后是UPDATE)。我目前的方法是将这些函数存储在一个数组中,然后在这个数组上调用async.parallel。

我担心它会导致ENOMEM或其他什么。

这里有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用生成器执行队列:

var totalTasks = 1000000;
var nTasks = 0;

// Generate data to send to query 
var getData = (function() {
    var i = 0;

    return function() {
        i++;
        return {
            number: i
        };
    };

})();

// Create the task running each time
var task = function(data, done) {
    nTasks++;
    console.log("Make task", nTasks);
    doQuery(data, done);
};

// Create queue with a limit concurrency
var queue = async.queue(task, 10); // <- parallels queries*

// The callback execute each task was execute
var cb = function(err) {
    if (err) throw err;

    // Add new tasks to queue if is neccesary    
    if (nTasks < totalTasks && queue.length() < queue.concurrency) {
        queue.push(getData(), cb);
    }

};

var i;

// Add the first x tasks to queue
for (i = 0; i < queue.concurrency; i++) {
    queue.push(getData(), cb);
}
  • 您需要考虑连接池的大小,或MySQL的最大当前进程数。

答案 1 :(得分:0)

如果你想处理每一行,你可以使用Mysql stream ,这样你就可以对每一行应用你想要的任何东西(在你的情况下更新);