A. *_*ner 10 javascript https http node.js
我在 Windows 7 64 位操作系统上对包含大量数据的数据库进行了大量调用。由于呼叫正在排队,我收到错误消息(在第一个错误之后永远是 HTTP 调用):
Error: connect ENOBUFS *omitted* - Local (undefined:undefined)
Run Code Online (Sandbox Code Playgroud)
从我的谷歌搜索中,我了解到这个错误意味着我的缓冲区变得太大,我的系统内存无法再处理缓冲区的大小。
但我真的不明白这是什么意思。我正在使用 node.js 和一个 HTTPS 库来处理我的请求。当请求排队并且套接字打开时,缓冲区的大小是否在 RAM 中分配?什么将允许缓冲区扩展到更大的大小?这仅仅是硬件限制吗?
我还读到某些操作系统能够比其他操作系统更好地处理缓冲区的大小。是这种情况吗?如果是这样,哪个操作系统更适合运行需要通过 HTTPS 请求获取大量数据的节点脚本?
这是我如何处理我的请求。
for (let j = 0; j < dataQueries; j++) {
getData(function())
}
function getData(callback){
axios.get(url, config)
.then((res) => {
// parse res
callback(parsedRes(res))
}).catch(function(err) {
console.log("Spooky problem alert! : " + err);
})
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我省略了一些代码,但这通常是我处理请求的方式。我有一个 for 循环,每次迭代都会通过 axios 启动一个 GET 请求。
我知道有一个 axios.all 命令用于存储 axios.HTTPMethod 为您提供的承诺,但是当我将其设置为存储承诺然后通过 axios.all 迭代这些承诺时,我发现我的代码没有任何变化
A. *_*ner 10
感谢@Jonasw 的帮助,但是这个问题有一个非常简单的解决方案。我使用小型库节流队列来完成工作。(如果你查看源代码,基于这个包实现你自己的队列会很容易。
我的代码改为:
const throttledQueue = require('throttled-queue')
let throttle = throttledQueue(15, 1000) // 15 times per second
for (let j = 0; j < dataQueries; j++) {\
throttle(function(){
getData(function(res){
// do parsing
})
}
}
function getData(callback){
axios.get(url, config)
.then((res) => {
// parse res
callback(parsedRes(res))
}).catch(function(err) {
console.log("Spooky problem alert! : " + err);
})
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17535 次 |
| 最近记录: |