每次都是运行 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 cF06myaQ57WHKMBv 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() |