当前位置: 首页 > 知识库问答 >
问题:

Qpromise节点的并发限制

葛念
2023-03-14

有没有使用Qpromise库限制promise并发的方法?

这个问题有点与如何限制Qpromise并发有关?

但问题是我正试图这样做:

for (var i = 0; i <= 1000; i++) {
  return Q.all([ task1(i), task2(i) ]); // <-- limit this to 2 at a time.
}

真正的用例是:

  1. 从DB获取帖子
  2. 循环DB中的每个帖子,如posts.for每个(函数(post){}
  3. 对于每个帖子做task1,task2,task3(检索社交计数器,检索评论计数等)
  4. 在DB中保存新的文章数据

但问题是node同时执行所有帖子的所有任务,比如同时向facebook询问500篇帖子的“喜欢次数”。

如何限制Q.all()一次只能有两篇文章执行任务?或者,还有什么其他可能的解决方案可以应用于此?

注意:大多数任务(如果不是全部)依赖于请求库

共有3个答案

陶裕
2023-03-14

下面是我用来限制qpromise的代码

我只是把它从一个我需要它的项目中删掉了。如果有更多的人感兴趣,我可以把它分成一个模块或别的什么。

谭向晨
2023-03-14

几天前我问了一个非常相似的问题: Node.js/Express和并行队列

我找到的解决方案(见我自己的答案)是使用曹兰的异步。它允许您创建“操作队列”,并且可以限制并发运行的数量:请参阅“队列”方法。

在您的例子中,节点的主循环将从Q中提取元素,并在队列中为每个元素创建一个任务。您还可以限制这一点(因此基本上不会在Q之外重新创建队列),例如,仅当执行最后一个元素时,才向队列添加N个新元素(“queue”方法的“empty”回调)。

郑景胜
2023-03-14

多亏了Dan,他的回答和他帮助我将它与我的代码集成,可以使用他的要点和这样的片段来完成:

var qlimit = require('../libs/qlimit');

var test = function(id) {
  console.log('Running ' + id);
  return Q.nfcall(request, 'some dummy url which takes some time to process, for example a php file with sleep(5)').spread(function(response, body) {
    console.log('Response ' + id);
    return body;
  });
}

test = qlimit.limitConcurrency(test, 1);

var data = [0, 1, 2];

data.forEach(function(id) {
  console.log('Starting item ' + id);
  Q.all([ test(id) ]);
});

通过这种方式,您可以得到如下结果:

  • 开始项目0
  • 开始项目1
  • 开始项目2
  • 运行0
  • 响应0
  • 跑步1
  • 回应1
  • 跑步2
  • 回应2

这显然是一次一个请求。

我在实现中遗漏的一点是,在启动循环之前,需要使用limitConcurrency重新声明函数,而不是在循环内部。

 类似资料:
  • 如何编写限制Qpromise并发的方法? 例如,我有一个方法。 我希望一次生成不超过5个进程,但对调用代码是透明的。 我需要实现的是一个带有签名的函数 我可以这样称呼他 我已经开始编写我的版本,但我想知道是否有人有一个简洁的实现,我可以对照它进行检查。

  • 有没有办法限制节点js中一次执行的并发Qpromise的数量? 我正在构建一个web scraper,它必须请求并解析3000多个页面,并且在没有限制的情况下,我提出的一些请求没有及时响应,因此连接停止,所需的响应(html代码)变得不可用。 为了解决这个问题,我发现限制请求的数量可以解决我的问题。 我曾尝试过以下方法,但均无效: Qpromise中的并发限制-节点 我需要请求一个URL数组,一次

  • 这是港口范围。我不确定这是否重要(我不确定DNAT和SNAT是否使用端口),但范围似乎远高于16K。 还有什么可能限制通过iptables/netfilter转发的并发连接的数量吗?

  • 我正在寻找下面输入和输出XML的XSLT(1.0)代码。 在输出XML中,C6元素下可以有任何子节点。在下面的XML中,我放了CN元素,但它可以是任何名称。 输入XML- 所需的输出XML- 先谢谢你。

  • 我有两个节点js应用程序,一个发送post请求,如下所示: 另一个是试图用表达式和正文解析器来处理它: 问题是在接收端我无法检索我正在寻找的json数据。有人知道我错过了什么吗?

  • 主要内容:1.算法,2.单机限流器,3.分布式限流器,4.接入层限流器1.算法 计数器 漏桶算法 令牌桶算法 滑动窗口算法 1.1 计数器法 实现简单, 就是临界值问题 指在指定的时间里累加访问量,达到阈值后,触发限流策略,在下一周期访问数量清除 使用redis的incr和key过期 问题:在相邻的一个时间段20s内,请求超过100。 这个算法通常用于QPS限流和统计总访问量,对于秒级以上的时间周期来说,会存在一个非常严重的问题,那就是临界问题。 假设1min内服务