如何使用 Node Streams 和 Promises 避免内存泄漏
How to avoid memory leaks with the use of Node Streams and promises
我尝试将节点流包装在异步函数中。但是我想知道下面的代码是否会泄漏内存。 readStream
和 result
会在 promise 被解决(拒绝)后被垃圾回收吗?如果不是,我应该如何避免内存泄漏?
async function readFile(path, keyword) {
const readStream = fs.createReadStream(path, {encoding: 'utf8'});
let result = await getCachedResult(); // getCachedResult is another async function
return new Promise((resolve, reject) => {
readStream.on('data', (chunk) => {
if (chunk.includes(keyword)) {
result += chunk;
}
})
readStream.on('error', (err) => {
reject(err)
readStream.close()
})
readStream.on('end', () => {
resolve(result)
readStream.close()
})
})
}
当前 JavaScript 内存垃圾收集算法基于删除代码中无法访问的数据对象和值(包括包含函数变量和参数的环境记录对象).
那么 async function readFile
体内的哪些数据对象和值是可访问的 在 它 returns Promise 对象之后?
返回后没有保留对path
或keyword
的引用,因此它们符合GC条件。
对 readStream
、result
、resolve
、reject
、chunk
和 err
的引用仅由匿名函数处理持有在流上注册的流事件。
可以从 readStream
实例对象(或其事件发射器)访问处理函数。
readStream
对象负责删除对无法再进行的回调的引用:在 end
事件本身之后,或在调用 readStrem.close
之后。无论哪种方式,您都无需担心使用承诺或读取流会造成内存泄漏。
我尝试将节点流包装在异步函数中。但是我想知道下面的代码是否会泄漏内存。 readStream
和 result
会在 promise 被解决(拒绝)后被垃圾回收吗?如果不是,我应该如何避免内存泄漏?
async function readFile(path, keyword) {
const readStream = fs.createReadStream(path, {encoding: 'utf8'});
let result = await getCachedResult(); // getCachedResult is another async function
return new Promise((resolve, reject) => {
readStream.on('data', (chunk) => {
if (chunk.includes(keyword)) {
result += chunk;
}
})
readStream.on('error', (err) => {
reject(err)
readStream.close()
})
readStream.on('end', () => {
resolve(result)
readStream.close()
})
})
}
当前 JavaScript 内存垃圾收集算法基于删除代码中无法访问的数据对象和值(包括包含函数变量和参数的环境记录对象).
那么 async function readFile
体内的哪些数据对象和值是可访问的 在 它 returns Promise 对象之后?
返回后没有保留对path
或keyword
的引用,因此它们符合GC条件。
对 readStream
、result
、resolve
、reject
、chunk
和 err
的引用仅由匿名函数处理持有在流上注册的流事件。
可以从 readStream
实例对象(或其事件发射器)访问处理函数。
readStream
对象负责删除对无法再进行的回调的引用:在 end
事件本身之后,或在调用 readStrem.close
之后。无论哪种方式,您都无需担心使用承诺或读取流会造成内存泄漏。