我有一个函数,我想调用 100 万次。该函数对数据库进行两次调用(首先是 SELECT,然后是 UPDATE)。我当前的方法是将这些函数存储在一个数组中,然后在此数组上调用 async.parallel。
我担心这会导致 ENOMEM 或其他结果。
这里有更好的方法吗?
最佳答案
您可以使用生成器进行队列:
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当前最大进程数。
关于node.js - async.parallel 适用于大量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33442622/