我需要在我正在编写的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())
})正如您所看到的,我正在从一个文件中读取urls,然后使用.reduce()对每个urls串行运行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)});
})如您所见,我将main()函数及其参数放在Promise.try之后,并将参数放在返回的queue.push之后。我不确定这是对还是错。
但是不管我现在卡住了,我怎么把所有的迭代加载到队列中呢?
发布于 2017-07-16 13:23:45
您可以使用npm:https://www.npmjs.com/package/qew中的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
})在这段代码中,您将从文件中读取urls,然后将一组函数逐个加载到qew中,等待它们全部解析后再对其执行操作。
完整的免责声明:我是这个包的作者。
https://stackoverflow.com/questions/45096841
复制相似问题