如何在javascript中控制并发?

时间:2017-07-14 07:10:05

标签: javascript node.js concurrency

我需要在我正在制作的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之后放了我的参数。不确定这是否正确。

但不管现在我被卡住了,如何将所有迭代加载到队列中?

1 个答案:

答案 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中,并等待所有这些功能解决,然后再对其进行操作。

完整免责声明:我是此套餐的作者。