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 笨拙的實現了功能,特此寫下此篇文章做爲記錄。函數

相關文章
相關標籤/搜索