以小批次同时运行承诺(每次不超过X)

asynchronous库具有像eachLimit这样的function,可用于在多个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); 

这样可以避免一次使用过多的命令来重载系统,但是仍然会利用多个CPU。

我想要做同样的事情,但有了诺言。

在Bluebird API中 ,我看不出有什么明显的方式来用Async这样一种简洁而富有performance力的方式来进行这种批处理。

Bluebird(或一般的Promise)有没有一个好的模式? 或者我可以使用的任何其他实用程序库?

在Bluebird中,你可以使用带有concurrency选项的Promise.map函数 ,像这样

 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" />