我有一个Node.js应用程序,它在本地获取文件列表并将它们上传到服务器.此列表可能包含数千个文件.
for (var i = 0; i < files.length; i++) {
upload_file(files[i]);
}
Run Code Online (Sandbox Code Playgroud)
如果我用数千个文件执行此操作,upload_file将同时被调用数千次,并且很可能死亡(或者至少是挣扎).在同步世界中,我们创建一个线程池并将其限制为一定数量的线程.是否有一种简单的方法可以限制一次执行多少次异步调用?
我有一个请求 - 承诺函数,它向API发出请求.我受这个API的速率限制,我不断收到错误消息:
Exceeded 2 calls per second for api client. Reduce request rates to resume uninterrupted service.
Run Code Online (Sandbox Code Playgroud)
我正在Promise.each并行运行几个循环导致问题,如果我只运行一个实例Promise.each运行正常.在这些Promise.each调用中,它们通过请求 - 承诺调用导致相同的功能a .我想用另一个queue函数包装这个函数,并将间隔设置为500毫秒,这样a request就不会在一个或另一个之后进行,而是在队列上设置为那个时间.事情是,即使需要相当长的时间来获得回复,我仍然需要这些承诺来获取其内容.
有什么能帮我的吗?我可以包装一个函数的东西,它将以一个设定的间隔响应,而不是并行响应或一个接一个的消防功能?
更新:也许它确实需要特定的承诺,我试图使用下划线的油门功能
var debug = require("debug")("throttle")
var _ = require("underscore")
var request = require("request-promise")
function requestSite(){
debug("request started")
function throttleRequest(){
return request({
"url": "https://www.google.com"
}).then(function(response){
debug("request finished")
})
}
return _.throttle(throttleRequest, 100)
}
requestSite()
requestSite()
requestSite()
Run Code Online (Sandbox Code Playgroud)
我得到的就是这个:
$ DEBUG=* node throttle.js …Run Code Online (Sandbox Code Playgroud) 我正在使用请求npm模块,并以大约每秒100个请求的周期发出上游请求。超时已设置为10秒。问题是我一直在1000个请求中始终获得1个的ESOCKETTIMEDOUT。
我非常确定上游服务器不会超时。这可能是什么原因以及如何避免它。
我有一个“脚本”,可以向特定 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()
Run Code Online (Sandbox Code Playgroud)
一旦连续发出大约 300 个请求(给予或接受),这些请求就会开始相互干扰。有没有人有更好的解决方案?我认为对同一个函数的递归调用会有所帮助,它确实做到了,但并没有解决问题。也许有一种模式可以将请求排队,并且一次做几个?也许是图书馆?
谢谢!