请求速率为limi的API上的异步请求

2024-05-15 01:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个需要通过API发出请求的项目中工作。请求返回有关支持票证的数据,但问题是我有大约500个票证需要获取数据,而每个票证都需要一个请求。为了加快请求速度,我尝试构建一个异步例程,该例程同时生成多个请求。但是,由于我正在集成的API的速率限制为每秒10个请求,所以一些例程得到的答案是“limitexceed”。如果我按顺序提出请求,大约需要5分钟。在

那样的话,有人会给我一个提示吗?我尝试过一些解决方案,比如NodeJS的速率限制器,但是它只会同时生成10个请求,并且不会进行任何错误处理,也不会在请求失败时重试。在

关于语言,它没有限制,项目是用NodeJS编写的,但是也有一些python代码,没有集成其他语言的问题。在


Tags: 数据项目答案api语言顺序速率nodejs
1条回答
网友
1楼 · 发布于 2024-05-15 01:07:15

像这样的事情并不难创造你自己,它会给你所需的灵活性。在

有一些奇特的方法,比如跟踪每一个的开始和完成时间,并检查你是否在一秒钟内发送了10个。在

系统可能还将其限制为10个活动请求(也就是说,你不能启动100个请求,每秒10个,然后让它们全部处理)。在

如果你假设这样,我会说一次性启动10个,然后让它们完成,然后启动下一个批次。你也可以启动10个,然后每完成一个就额外启动1个。你可以把它想象成“thread pool”。在

您可以通过一个简单的变量跟踪正在进行的调用数来轻松跟踪这一点。然后,只需检查每秒有多少个调用正在进行(以避免1秒的限制),如果您有可用的“线程”,就启动更多的新请求。在

它可能看起来像这样:

const threadLimit = 10; const rateLimit = 1000; // ms let activeThreads = 0; const calls = new Array(100).fill(1).map((_, index) => index); // create an array 0 through 99 just for an example function run() { if (calls.length == 0) { console.log('complete'); return; } // threadLimit - activeThreads is how many new threads we can start for (let i = 0; i < threadLimit - activeThreads && calls.length > 0; i++) { activeThreads++; // add a thread call(calls.shift()) .then(done); } setInterval(run, rateLimit); } function done(val) { console.log(`Done ${val}`); activeThreads ; // remove a thread } function call(val) { console.log(`Starting ${val}`); return new Promise(resolve => waitToFinish(resolve, val)); } // random function to simulate a network call function waitToFinish(resolve, val) { const done = Math.random() < .1; // 10% chance to finish done && resolve(val) if (!done) setInterval(() => waitToFinish(resolve, val), 10); return done; } run();

和13;
和13;

基本上,run()只是根据限制和完成的线程数来启动它能启动多少个新线程。然后,它只是每秒钟重复这个过程,尽可能地添加新的过程。在

您可能需要使用threadLimitrateLimit值,因为大多数速率限制系统实际上不允许您直接到达限制,并且不会在完成后立即释放它。在

相关问题 更多 >

    热门问题