NodeJS 写了一个程序,循环读取一个全局数组变量,当数组不为空时,把条目 POP 下来,提交给处理函数,处理函数使用 Promise 实现。
执行到最后,当数组没有条目了,程序就停止那里不动,没有自动退出。
有遇到过这种情况的吗?这有可能是什么原因造成的?
1 mooncakejs 2019-05-29 16:23:17 +08:00 via iPhone ![]() 望闻问切,好歹来个代码啊 |
![]() | 2 nyse OP |
![]() | 3 yangg 2019-05-29 16:33:19 +08:00 ![]() process.on('uncaughtException', ...) |
![]() | 4 airyland 2019-05-29 16:54:54 +08:00 via iPhone ![]() 看看有没有 setInterval |
![]() | 5 v2nika 2019-05-29 16:58:00 +08:00 ![]() Node.js 中的 io 句柄和 setTimeout/setInterval/setImmediate 默认都会阻止进程退出, 所以你的脚本应该是没跑完, 如果项目太大的话, 可以用 inspect 看一下 |
![]() | 6 maichael 2019-05-29 16:58:55 +08:00 ![]() 有写退出的逻辑吗?当数组为空时是怎么处理的。 |
![]() | 7 AlloVince 2019-05-29 17:11:17 +08:00 ![]() 如果使用了连接 redis 或者 mysql 的库,一般需要在程序执行完后手动断开连接,否则会保持连接,程序不会退出 |
![]() | 8 winglight2016 2019-05-29 21:49:45 +08:00 ![]() 使用了 promise 或者 async/wait 这种异步代码是有可能因为某个异常没有捕获,或者资源没有释放而阻塞,用 try/catch/final 处理一下吧。 |
![]() | 9 nondanee 2019-05-30 02:41:40 +08:00 via Android ![]() 可能是还有 .on('xxx-event', () => {}) 事件监听没 end 吧 |
![]() | 10 jiejiss 2019-05-30 07:37:45 +08:00 ![]() 如果还有 task 没有处理完就不会退出 不过一般来讲都是 macrotask 的锅,因为 microtask 从注册到释放不会超过两个 time loop |
![]() | 11 libook 2019-05-30 12:47:59 +08:00 ![]() 比如监听端口: const http = require('http'); cont server = http.createServer(console.log); server.listen(8080); console.log(`Server is running.`); 又比如 Promise 预期会执行 resolve 或 reject,只不过暂时还没有执行的时候: new Promise((res, rej) => { setTimeout(res, 5000); }) 死循环也会出现进程一直没退出的现象。 |
12 flyingfz 2019-05-30 17:22:41 +08:00 ![]() process.exit(0); |
![]() | 13 nyse OP 问题找到了,确实是应为没断开 MySQL 连接造成的。 感谢大家提供的思路。 |
14 Lws 2020-05-22 20:42:43 +08:00 @winglight2016 确实如此,promise 造成了我的代理一直不退出。我这里的 promise 太多,写捕获还是有点麻烦的。看了下 node 有提供--unhandled-rejectiOns=strict 在遇到未捕获时自动退出程序 |