我有多个函数调用不同的api端点,我需要尽快调用它们而不超过某些限制(例如每秒20次调用)。我目前的解决方案是延迟并按照我给出的示例每隔50毫秒调用一次该函数,但我想尽快调用它们,而不是仅仅使用速率限制来平均调用它们。
答案 0 :(得分:0)
function-rate-limit为我解决了类似的问题。函数速率限制会随着时间的推移扩展对函数的调用,而不会调用对函数的调用。在达到速率限制之前,它仍允许对您进行即时调用,因此它可以在正常情况下无延迟地运行。
功能速率限制文档的示例:
var rateLimit = require('function-rate-limit');
// limit to 2 executions per 1000ms
var start = Date.now()
var fn = rateLimit(2, 1000, function (x) {
console.log('%s ms - %s', Date.now() - start, x);
});
for (var y = 0; y < 10; y++) {
fn(y);
}
结果:
10 ms - 0
11 ms - 1
1004 ms - 2
1012 ms - 3
2008 ms - 4
2013 ms - 5
3010 ms - 6
3014 ms - 7
4017 ms - 8
4017 ms - 9
答案 1 :(得分:-1)
您可以尝试使用async中的队列。这样做时要小心,它在其他语言中的行为基本上类似于while(true)
:
const async = require('async');
const concurrent = 10; // At most 10 concurrent ops;
const tasks = Array(concurrent).fill().map((e, i) => i);
let pushBack; // let's create a ref to a lambda function
const myAsyncFunction = (task) => {
// TODO: Swap with the actual implementation
return Promise.resolve(task);
};
const q = async.queue((task, cb) => {
myAsyncFunction(task)
.then((result) => {
pushBack(task);
cb(null, result);
})
.catch((err) => cb(err, null));
}, tasks.length);
pushBack = (task) => q.push(task);
q.push(tasks);
这里发生了什么?我们说&#34;他们并行运行X任务&#34;并且在每个任务完成之后,我们将其放回队列中,这相当于说&#34;永远并行运行X任务&#34;