gpt4 book ai didi

javascript - Q promise 中的并发限制 - Node

转载 作者:数据小太阳 更新时间:2023-10-29 04:44:15 25 4
gpt4 key购买 nike

有没有什么方法可以使用 Q promises 库来限制 promise 的并发?

这个问题有点相关How can I limit Q promise concurrency?

但问题是我正在尝试做这样的事情:

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

实际用例是:

  1. 从数据库中获取帖子
  2. 循环数据库中的每个帖子,如 posts.forEach(function(post) {}
  3. 对每个帖子执行任务 1、任务 2、任务 3(检索社交计数器、检索评论计数等)
  4. 在数据库中保存新的帖子数据。

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

我如何限制 Q.all() 一次只有 2 个帖子在执行它们的任务?或者还有哪些其他可能的解决方案可以适用于此?

注意:大部分任务(如果不是全部)都依赖于 request library

最佳答案

感谢 Dan,他的 answer以及他将其与我的代码集成的帮助,可以使用他的 gist 来完成和这样的片段:

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

这显然是一次 1 个请求。

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

关于javascript - Q promise 中的并发限制 - Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com