运行 以小并发批次承诺(一次不超过 X)
Running promises in small concurrent batches (no more than X at a time)
Async 库具有类似 eachLimit 的功能,可用于在多个 CPU 核心上有效地分布一大批作业,如下所示:
var numCPUs = require('os').cpus().length;
var exec = require('child_process').exec;
async.eachLimit(someArray, numCPUs, function (value, done) {
exec('something --input' + value, done);
}, finalCallback);
这可以避免同时使用太多命令使系统过载,但仍会利用多个 CPUs。
我想用 Promises 做同样的事情。
在 Bluebird API 中,我看不出有任何明显的方法可以像 Async 一样以如此简洁、富有表现力的方式进行这种批处理。
是否有使用 Bluebird(或通常使用 Promises)执行此操作的良好模式?或者我可以为此使用的任何其他实用程序库?
在 Bluebird 中,您可以使用 Promise.map
function with the concurrency
option,像这样
require('bluebird').map([1, 2, 3, 4, 5, 6], function (currentNumber) {
console.log(currentNumber);
return Promise.delay(currentNumber * 2, 1000);
}, {concurrency: 2}).then(console.error.bind(console));
现在,您可以看到它一次处理两个值。正在处理的值可能顺序不同,但结果数组中的项目将与原始数组对应的顺序相同。
PS:我用Promise.delay
引入了1秒的延迟,这样我们可以观察到当前正在处理什么。
演示
function start() {
document.getElementById("result").innerHTML = "";
Promise.map([1, 2, 3, 4, 5, 6], function(currentNumber) {
document.getElementById("result").innerHTML += currentNumber + "<br />";
return Promise.delay(currentNumber * 2, 1000);
}, {
concurrency: parseInt(document.getElementById("concurrency").value, 10)
}).then(function(result) {
document.getElementById("result").innerHTML += result + "<br />";
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.27/bluebird.min.js"></script>
Limit: <input id="concurrency" value="2" />
<input type="button" onclick="start()" value="Start" />
<pre id="result" />
Async 库具有类似 eachLimit 的功能,可用于在多个 CPU 核心上有效地分布一大批作业,如下所示:
var numCPUs = require('os').cpus().length;
var exec = require('child_process').exec;
async.eachLimit(someArray, numCPUs, function (value, done) {
exec('something --input' + value, done);
}, finalCallback);
这可以避免同时使用太多命令使系统过载,但仍会利用多个 CPUs。
我想用 Promises 做同样的事情。
在 Bluebird API 中,我看不出有任何明显的方法可以像 Async 一样以如此简洁、富有表现力的方式进行这种批处理。
是否有使用 Bluebird(或通常使用 Promises)执行此操作的良好模式?或者我可以为此使用的任何其他实用程序库?
在 Bluebird 中,您可以使用 Promise.map
function with the concurrency
option,像这样
require('bluebird').map([1, 2, 3, 4, 5, 6], function (currentNumber) {
console.log(currentNumber);
return Promise.delay(currentNumber * 2, 1000);
}, {concurrency: 2}).then(console.error.bind(console));
现在,您可以看到它一次处理两个值。正在处理的值可能顺序不同,但结果数组中的项目将与原始数组对应的顺序相同。
PS:我用Promise.delay
引入了1秒的延迟,这样我们可以观察到当前正在处理什么。
演示
function start() {
document.getElementById("result").innerHTML = "";
Promise.map([1, 2, 3, 4, 5, 6], function(currentNumber) {
document.getElementById("result").innerHTML += currentNumber + "<br />";
return Promise.delay(currentNumber * 2, 1000);
}, {
concurrency: parseInt(document.getElementById("concurrency").value, 10)
}).then(function(result) {
document.getElementById("result").innerHTML += result + "<br />";
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.27/bluebird.min.js"></script>
Limit: <input id="concurrency" value="2" />
<input type="button" onclick="start()" value="Start" />
<pre id="result" />