gpt4 book ai didi

javascript - Nodejs Promise 设计中的内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:41 45 4
gpt4 key购买 nike

我注意到这里有些人建议当你想延迟某些事情的执行时使用await/async和promise而不是直接使用setTimeout。这是代码:

async wait (ms){
return new Promise(resolve => setTimeout(resolve, ms));
}

所以我会使用

await wait(3000);
my_function();

而不是

setTimeout(() => {
my_function();
}, 3000);

这是有道理的,但我注意到,如果我这样做,我会增加内存使用量,最终应用程序会在几个小时后因内存不足而崩溃。

这是nodejs的promise设计中的问题,还是我在这里遗漏了一些东西?

<小时/>

此代码重现了该问题:

const heapdump = require('heapdump'),
fs = require('fs');
class test {
constructor(){
this.repeatFunc();
}
async wait (ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
async repeatFunc(){
// do some work...
heapdump.writeSnapshot(__dirname + '/' + Date.now() + '.heapsnapshot');

await this.wait(5000);
await this.repeatFunc();
}
}
new test();

注意堆转储每 5 秒不断增加

使用 setInterval 就不会发生这种情况:

const heapdump = require('heapdump'),
fs = require('fs');
class test {
constructor() {
setInterval(this.repeatFunc, 5000);
}
repeatFunc() {
// do some work...
heapdump.writeSnapshot(__dirname + '/' + Date.now() + '.heapsnapshot');
}
}
new test();

最佳答案

您编写了一个无限递归函数,并且每个函数调用都返回一个新的 Promise。每一个 promise 都在等待内在的解决——所以,是的,它当然正在积累内存。如果代码是同步的,您将会收到堆栈溢出异常。

只需使用循环即可:

const heapdump = require('heapdump'),
fs = require('fs');

async function wait(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
async function repeat() {
while (true) {
// do some work...
heapdump.writeSnapshot(__dirname + '/' + Date.now() + '.heapsnapshot');

await wait(5000);
}
}

repeat().then(() => console.log("all done"), console.error);
<小时/>

I noticed some people here recommend to use await/async and promise instead of setTimeout directly when you want to delay the execution of something.

这也包括我,因为 Promise 更容易使用,特别是当您想从异步任务返回结果值或处理错误时。但是,如果您不相信 Promise 的任何优点,那么没有什么可以强制您将已经运行的代码转换为 Promise。只要继续使用回调风格,直到找到 Promise 的良好用途。

关于javascript - Nodejs Promise 设计中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427285/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com