Node.js async.parallelLimit 与 async.eachLimit 的区别与不一样使用场景

概述

async.parallelLimit 方法在文档中位于 Controll Flow 章节,代表这个方法是用来作流程控制的,async.eachLimit 方法位于 Collections 章节,代表这个方法是用来作数据处理的。在实际开发中咱们可使用这两个方法来完成一样的工做,下面咱们就以给 26 位用户发送邮件这个任务来举例。html

使用 async.parallelLimit 方法实现

async.parallelLimit 方法接受两个参数,第一个参数为任务数组,每一个任务是一个函数,第二个参数为每次并行执行的任务数,第三个参数为回调函数。使用 async.parallelLimit 完成发送邮件任务的思路是先使用数据与所要作的任务,组装成任务数组交给 async.parallelLimit 方法去执行。git

let userEmailList = [ 'a@example.com', 'b@example.com', ..., 'z@example.com' ];
let limit = 5;
let taskList = userEmailList.map(function (email) {
    return function (callback) {
        sendEmail(email, function (error, result) {
            return callback(error, result);
        });
    }
});
async.parallel(taskList, limit, function (error, result) {
    console.log(error, result);
});

使用 async.eachLimit 方法实现

async.eachLimit 方法接受四个参数,第一个参数为原始数据数组,第二个参数为每次并行处理的数据量,第三个参数为须要为数据进行的处理,第四个参数为回调函数。使用 async.eachLimit 完成发送邮件任务的思路是定义一个对数据进行处理的函数,而后使用 async.eachLimit 将处理函数应用全部数据上。github

let userEmailList = [ 'a@example.com', 'b@example.com', ..., 'z@example.com' ];
let limit = 5;
let processer = function (email) {
    sendEmail(email, function (error) {
        return callback(error, result);
    });
}
async.eachLimit(userEmailList, limit, processer, function (error, result){
    console.log(error);
});

经过以上代码和 async 文档 能够看出 each 系列函数最终的回调函数是没有运行结果的,因此每一次 processor 中的结果须要另行存储处理。数组

总结

经过对比以上两种方案,很容易发现 async.parallelLimitasync.eachLimit 的区别与应用场景,async.parallelLimit 做为流程控制方法,应该应用于并发处理不一样的任务并返回结果,async.eachLimit 做为数据处理方法,应该应用于并发地对一批数据进行相同的处理。因此显然对于给 26 为用户发送邮件这个任务应该使用 async.eachLimit 方法来实现。并发

在应用场景选择恰当的状况下不多使用到 async.parallelLimit 方法,使用 async.parallel 就能够了,毕竟任务数量不会很是巨大,不作限制一次性并行执行也不会有太大问题。可是若是使用不当,用做数据处理,数据的量级可能会很是巨大,若是不作并行数量限制显然是不可取的方式。async

由于对于这两个方法理解地不够透彻,而且受到 Promise.all 使用方式的影响,不少历史代码中从未出现过 async.eachLimit,都是使用 async.parallelLimit 配合 map 笨拙的实现了功能,特此写下此篇文章做为记录。函数

相关文章
相关标签/搜索