我需要在我正在制作的Node.js脚本中控制并发性。目前我正在尝试使用npm promise-task-queue,但我对其他建议持开放态度。
我不确定如何在我的代码中实现promise-task-queue。这是我原来的计划:
readURLsfromFile().then( (urls) => {
urls.reduce( (accumulator, current, i) => {
return accumulator.then( () => {
return main(urls[i], i, urls.length)
})
}, Promise.resolve())
})
正如您所看到的,我正在从文件中读取URL,然后使用.reduce()在每个URL上连续运行main()。但串行速度太慢,所以我需要使用受控并发。
这是我开始使用promise-task-queue编写的代码(这是非常错误的,我不知道我在做什么):
var taskQueue = require("promise-task-queue");
var queue = taskQueue();
var failedRequests = 0;
queue.on("failed:apiRequest", function(task) {
failedRequests += 1;
});
queue.define("apiRequest", function(task) {
return Promise.try( () => {
return main(urls[i], i, urls.length));
}).then( () => {
return console.log("DONE!");
});
}, {
concurrency: 2
});
Promise.try( () => {
/* The following queues up the actual task. Note how it returns a Promise! */
return queue.push("apiRequest", {url: urls[i], iteration: i, amountToDo: urls.length)});
})
正如你所看到的,我在Promise.try之后把我的main()函数和它的参数放在一起,并且我在return queue.push之后放了我的参数。不确定这是否正确。
但不管现在我被卡住了,如何将所有迭代加载到队列中?
答案 0 :(得分:0)
您可以使用npm:qew中的https://www.npmjs.com/package/qew模块。
使用npm install qew
安装。
初始化你做
const Qew = require('qew');
const maxConcurrent = 3;
const qew = new Qew(maxConcurrent);
使用上面的代码qew
现在将成为一个队列,允许您将异步函数推送到最大并发度为3的异步函数上。
要将新的异步功能推送到qew,您可以执行
qew.pushProm(asyncFunc);
所以在你的情况下,如果我理解你,你可以做类似
的事情readURLsfromFile()
.then(urls => {
return Promise.all(urls.map(url => { // wait for all promises to resolve
return qew.pushProm(() => main(url)); // push function onto queue
}));
})
.then(results => {
// do stuff with results
})
在这段代码中,您正在从文件中读取网址,然后将一堆函数逐个加载到qew
中,并等待所有这些功能解决,然后再对其进行操作。
完整免责声明:我是此套餐的作者。