我有一个“脚本”,它可以向特定的API发送数千个请求。这个API每秒只允许5个请求(可能它的测量方法与我不同)。为了发出请求,我使用了request-promise
框架,我用这个取代了普通的request-promise
函数:
const request_promise = require('request-promise')
function waitRetryPromise() {
var count = 0 // keeps count of requests
function rp(options) {
const timedCall = (resolve) => setTimeout( ()=>resolve(rp(options)),1000) // recursive call
count += 1
if (count % 3 == 0) { // recalls after a second on every third request
return new Promise(timedCall)
} else {
return request_promise(options)
}
}
return rp
}
const rp = waitRetryPromise()
一旦有大约300个请求(给予或take)在短时间内被连续发出,这些请求就开始相互干扰了。有没有人有更好的解决方案?我认为递归调用这个函数会有所帮助,它确实解决了这个问题,但它没有解决这个问题。也许有一种模式可以将请求排队,一次只做几个?也许是一个库?
谢谢!
4条答案
按热度按时间dgjrabp21#
好的,不要递归调用rp等,只要确保在请求之间有适当的延迟即可……每秒5次,即200ms
7fyelxc52#
我的代码将运行
TimedQueue
,只要有工作要做。当所有工作完成时,process()
方法将解析:js81xvg63#
你可以使用mutex来同步运行在不同线程上的并发进程,并通过计时器来限制它们:
示例用法:
📍 互斥体库documentation
xzlaal3s4#
我不确定,但也许你从下面得到一些想法