每次都是运行 10 多个小时就卡死,不退出执行,也没有错误日志。
所以打了些断点想看看卡死在哪里了,结果在非常奇怪的位置。查看内存溢出,fd 溢出等等都比较正常。stack 追踪太复杂,没找到合适的工具。
查论坛有个解决办法就是限制循环运行的次数,在运行一段时间后主动使用 process.exit 退出然后让 pm2 拉起来。
于是准备去改代码实操了,却发现之前的代码是这样的 👇
let retryCount = 4 * 60 * 60; // 基于库存检测的模式,单次耗时 3s 左右。
(async () => {
// ....
// 循环检测购物车
for (let i = 0; i < retryCount; i++) {
// ...
await sleep(5);
}
})();
Σ(°ロ°),原来是我自己加了 retryCount ,但是我忘记了!!!原来卡死就是循环次数耗尽了。(另外这一段代码循环次数耗尽并不会退出会阻塞住)
1
Belmode 2023-11-23 15:56:03 +08:00
不忍直视
|
2
coderxy 2023-11-23 16:38:17 +08:00
炸裂
|
3
Puteulanus 2023-11-23 16:43:00 +08:00
所以这不是 bug ,这是 feature
|
4
flyqie 2023-11-23 16:48:19 +08:00 via Android
所以。。楼主打算怎么 fix ?
|
5
ljtfdt 2023-11-23 16:51:16 +08:00
循环次数耗尽,为什么会阻塞住呢? for 循环不是不会执行了么
|
7
zihuyishi 2023-11-23 17:04:00 +08:00
八成还是哪里有 bug ,当你不知道他为什么会阻塞住的时候说明还是哪里有问题。你可能只是找到了一个表象的 bug
|
8
weiwenhao OP @flyqie 还是要 fix 一下,退出循环之后加上一个 exit(0) 让程序主动退出,然后现在也加上了 pm2 主动拉起。
|
10
zihuyishi 2023-11-23 17:12:23 +08:00
@weiwenhao 好久好久没写过 nodejs 了,不过我记得 libuv 应该是 loop 里有 callback 就不会退出循环吧。对应的就是 nodejs 如果有在运行的 Promise 就不会退出?
|
11
weiwenhao OP @zihuyishi 对的,我现在测试了一下,就是有没清理的环境,所以整个 async fn 不会退出。
(async () => { var browser = await firefox.launch(); var context = await browser.newContext(); // await context.close(); // 这里注释就不会退出执行。 // await browser.close(); console.log("done??"); })(); |
13
aikilan 2023-11-23 17:32:05 +08:00
笑出声来 :D
|
14
liuidetmks 2023-11-23 17:33:56 +08:00
数据库连接没关闭吧,
|
15
zsj1029 2023-11-23 17:41:18 +08:00
请用 for await ,否则循环不会等待,一次性 100 await sleep(5)
|
16
opengg 2023-11-24 03:31:01 +08:00 via Android
因为 node 在还持有 fd 或者连接,或者 event loop 未清空,或者监听了某些进程事件的时候,不会自动退出。
我曾经遇到过有个 sdk 存在未清理的 fd ,只能在代码里手动 exit() |