V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nojsja
V2EX  ›  Node.js

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

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

    可以从业务逻辑上来实现将状态保存到硬盘上,然后退出进程,以及启动恢复进程的时候从硬盘中读取状态继续执行。
    nojsja
        12
    nojsja  
    OP
       2021-12-20 18:41:46 +08:00
    @libook 👍很好的思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4806 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:57 · PVG 11:57 · LAX 19:57 · JFK 22:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.