首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中控制并发?

如何在javascript中控制并发?
EN

Stack Overflow用户
提问于 2017-07-14 15:10:05
回答 1查看 529关注 0票数 0

我需要在我正在编写的Node.js脚本中控制并发。目前,我正在尝试使用npm promise task-queue,但我对其他建议持开放态度。

我不确定如何在我的代码中实现promise-task-queue。这是我的原始程序:

代码语言:javascript
复制
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开始编写的代码(这是非常错误的,我不知道我在做什么):

代码语言:javascript
复制
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之后。我不确定这是对还是错。

但是不管我现在卡住了,我怎么把所有的迭代加载到队列中呢?

EN

回答 1

Stack Overflow用户

发布于 2017-07-16 13:23:45

您可以使用npm:https://www.npmjs.com/package/qew中的qew模块。

使用npm install qew进行安装。

要进行初始化,请执行以下操作

代码语言:javascript
复制
const Qew = require('qew');

const maxConcurrent = 3;
const qew = new Qew(maxConcurrent);

使用上面的代码,qew现在将成为一个队列,允许您将异步函数推送到该队列上,该队列将以3的最大并发数执行。

要将新的异步函数推送到qew上,您可以执行以下操作

代码语言:javascript
复制
qew.pushProm(asyncFunc);

所以在你的情况下,如果我理解正确的话,你可以这样做

代码语言:javascript
复制
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中,等待它们全部解析后再对其执行操作。

完整的免责声明:我是这个包的作者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45096841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档