node.js 能否实现子进程休眠

2021-12-20 12:40:35 +08:00
 nojsja
最近在做一个进程管理工具,想在社区问下,使用 fork 方式创建的子进程能否实现休眠。休眠之后减少系统资源占用,然后能在某个时机手动通过某种方式再给唤醒。
6050 次点击
所在节点    Node.js
12 条回复
ysc3839
2021-12-20 13:04:05 +08:00
Unix 下发送 SIGSTOP 信号即可暂停进程
ragnaroks
2021-12-20 13:04:45 +08:00
linux 下不了解,但 windows 下可以冻结(挂起)进程和进程组,类似 nginx 这样 fork 出来的进程都是没问题的,文档 MSDN 上有,但是有没有 nodejs 的包装就不知道了
nojsja
2021-12-20 14:38:27 +08:00
@ysc3839 我在 ubuntu 上试了一下 node.js 调用 process.kill(pid, "SIGSTOP") 和 系统的 kill -STOP pid 虽然都可以暂停进程,但似乎并没有减少资源占用。重点是想减少资源,不然暂不暂停的作用不太明显 😂
nojsja
2021-12-20 14:38:51 +08:00
@ragnaroks ok 我再看看
nojsja
2021-12-20 15:06:40 +08:00
const nil = new Int32Array(new SharedArrayBuffer(4));
const array = new Array(100000).fill(0);
setInterval(() => {
console.log(1);
}, 1e3);
Atomics.wait(nil, 0, 0, Number(600e3));
nojsja
2021-12-20 15:06:52 +08:00
Atomics.wait 方法,该方法会监听一个 Int32Array 对象的给定下标下的值,若值未发生改变,则一直等待(阻塞 event loop),直到发生超时(由 ms 参数决定定):
nojsja
2021-12-20 15:11:09 +08:00
上面这种方式官方说可以停止事件轮询,让进程睡眠,不过具体是什么表现还需测试
Kasumi20
2021-12-20 15:15:08 +08:00
与 fork(2) POSIX 系统调用不同,child_process.fork() 不克隆当前进程。所以“使用 fork 方式”和使用 child_process.spawn 、child_process.exec 有什么区别?
ysc3839
2021-12-20 16:11:43 +08:00
@nojsja 你要减少什么资源占用?减少内存一般是不可能的。
nojsja
2021-12-20 16:30:41 +08:00
@ysc3839 好吧,看来只能做 cpu 占用方面的优化了
libook
2021-12-20 17:10:25 +08:00
被动调度由操作系统来完成,操作系统是不会完全按照应用开发者的想法来管理资源的,所以有需求的话最好主动实现。

可以从业务逻辑上来实现将状态保存到硬盘上,然后退出进程,以及启动恢复进程的时候从硬盘中读取状态继续执行。
nojsja
2021-12-20 18:41:46 +08:00
@libook 👍很好的思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/823303

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX