簡體   English   中英

如何在 Node.js 處使用指定數量的並行處理 promise.all

[英]How to use promise.all with a specified number of parallel processing at Node.js

我有一個承諾清單:[pr1, pr2, pr3, pr4, pr5]。 因為每個 promise 都使用大量資源,所以我希望每次只運行指定數量的 Promise。

我嘗試了 Promise.allSettled(),我設置了一次運行 2 個承諾(pr1,pr2),但我必須等待 2 個承諾完成才能啟動 2 個下一個 pr(pr3,pr4)。 我想如果 pr1 很快完成,pr3 將替換 pr1 並且 2 個 promise 現在是 (pr2, pr3),總是 2 個 promise 運行。

如果有人有任何解決方案,很高興聽到您的解決方案。 太感謝了。

聽起來您想要一個緩沖區和一個 stream 從該緩沖區中獲取特定數量的背壓。 這不是簡單的Promise.all可以實現的。

我有一個承諾清單:[pr1, pr2, pr3, pr4, pr5]

如果你有 5 個 Promise 的列表,那么你已經有 5 件事情在並行處理。 沒有辦法阻止它,因為您已經通過創建承諾觸發了流程。

如果你想一次只處理其中兩個,你需要NOT CREATE THE PROMISES 因此,您需要的是一個返回承諾而不是 5 個承諾的 5 個函數的列表。

您需要的是一個[f1, f2, f3, f4, f5]數組,其中f1將返回pr1f2將返回pr2等。

一旦你有了這個,你需要做的就是一次對Promise.all()兩個承諾:

const tasks = [f1, f2, f3, f4, f5];

const BATCH_IN_PARALLEL = 2;

async function batchTasks() {
    for (let i=0; i<tasks.length;) {
        let promises = [];

        // create two promises at a time:
        for (let j=0; j<BATCH_IN_PARALLEL && i<tasks.length; i++,j++) {
            let t = tasks[i];
            promises.push(t()); // create the promise here!
        }

        await Promise.all(promises); // wait for the two promises
    }
}

如果您需要承諾的結果,只需將它們收集在一個數組中:

async function batchTasks() {
    let result = [];

    for (let i=0; i<tasks.length;) {
        let promises = [];

        // create two promises at a time:
        for (let j=0; j<BATCH_IN_PARALLEL && i<tasks.length; i++,j++) {
            let t = tasks[i];
            promises.push(t()); // create the promise here!
        }

        result.push(await Promise.all(promises));
    }

    return result;
}

以上是批處理的基本實現。 它一次只處理兩個異步函數,但它會等待兩個函數都完成,然后再處理兩個。 一旦完成,您就可以發揮創意並處理另一個 function,但其代碼涉及更多。

async-q庫有一個 function 可以做到這一點: asyncq.parallelLimit

const asyncq = require('async-q');

const tasks = [f1, f2, f3, f4, f5];

let result = asyncq.parallelLimit(tasks, 2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM