Nodejs 能否实现子进程休眠

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

Nodejs 能否实现子进程休眠

最近在做一个进程管理工具,想在社区问下,使用 fork 方式创建的子进程能否实现休眠。休眠之后减少系统资源占用,然后能在某个时机手动通过某种方式再给唤醒。

13 回复

Unix 下发送 SIGSTOP 信号即可暂停进程


linux 下不了解,但 windows 下可以冻结(挂起)进程和进程组,类似 nginx 这样 fork 出来的进程都是没问题的,文档 MSDN 上有,但是有没有 nodejs 的包装就不知道了

我在 ubuntu 上试了一下 node.js 调用 process.kill(pid, “SIGSTOP”) 和 系统的 kill -STOP pid 虽然都可以暂停进程,但似乎并没有减少资源占用。重点是想减少资源,不然暂不暂停的作用不太明显 😂

ok 我再看看

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));

Atomics.wait 方法,该方法会监听一个 Int32Array 对象的给定下标下的值,若值未发生改变,则一直等待(阻塞 event loop),直到发生超时(由 ms 参数决定定):

上面这种方式官方说可以停止事件轮询,让进程睡眠,不过具体是什么表现还需测试

与 fork(2) POSIX 系统调用不同,child_process.fork() 不克隆当前进程。所以“使用 fork 方式”和使用 child_process.spawn 、child_process.exec 有什么区别?

你要减少什么资源占用?减少内存一般是不可能的。

好吧,看来只能做 cpu 占用方面的优化了

被动调度由操作系统来完成,操作系统是不会完全按照应用开发者的想法来管理资源的,所以有需求的话最好主动实现。

可以从业务逻辑上来实现将状态保存到硬盘上,然后退出进程,以及启动恢复进程的时候从硬盘中读取状态继续执行。

👍很好的思路

当然可以,Node.js 可以通过创建子进程并使其休眠来实现这一功能。Node.js 提供了 child_process 模块来创建和管理子进程。在子进程中,你可以使用操作系统的命令来实现休眠功能,例如在 Unix 系统上使用 sleep 命令。

下面是一个简单的示例,展示如何在 Node.js 中创建一个子进程并使其休眠 5 秒:

const { exec } = require('child_process');

// 创建一个子进程执行 sleep 命令,休眠 5 秒
exec('sleep 5', (error, stdout, stderr) => {
  if (error) {
    console.error(`执行错误: ${error}`);
    return;
  }
  stdout ? console.log(`stdout: ${stdout}`) : console.log('无标准输出');
  stderr ? console.error(`stderr: ${stderr}`) : console.log('无错误输出');
  console.log('子进程休眠 5 秒后结束');
});

console.log('主进程继续执行');

在上面的代码中,exec 函数用于执行系统命令 sleep 5,这将导致子进程休眠 5 秒。同时,主进程会继续执行,不会等待子进程完成。5 秒后,子进程结束,回调函数被调用,打印出相应的信息。

请注意,sleep 命令在不同的操作系统上可能有所不同。例如,在 Windows 上,你可以使用 timeout 命令代替 sleep,例如 exec('timeout /t 5', callback)

这个示例展示了如何通过 Node.js 实现子进程休眠,同时说明了主进程和子进程的执行是异步的。

回到顶部