[英]Is Node.js native Promise.all processing in parallel or sequentially?
[英]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
將返回pr1
, f2
將返回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.