2017-02-27 62 views
1

我有一个NodeJS子进程正在侦听带有process.on('message', callback)的消息,但该进程正在立即退出。从我的阅读中,这不应该发生,因为我有一个回调等待事件循环,那么为什么NodeJS退出?NodeJS过早退出

下面的示例代码应该能够作为独立的NodeJS进程运行,并且不会退出,正确吗?

节点版本:7.3.0

示例代码:

function handle(msg) { 
    //do work here 
} 

process.on('message', (msg) => { 
    handle(msg); 
} 
+0

您能否给我们提供更多信息 - 此代码如何运行?当你说退出时,程序本身是否退出?这是一个独立的脚本还是服务器?如果你想查看'message'事件的文档 - https://nodejs.org/api/process.html#process_event_message - 你会注意到它只有在Node进程通过IPC产生时才被触发。 – GPX

+0

这个例子是非常多的..我使用child process.fork生成了上面的脚本,并且子进程在执行完脚本之后就退出了,但我希望它保持活跃状态​​监听消息来处理单独产生的进程中的一些工作而不是每次我需要完成工作时都产生一个新的过程 – weagle08

回答

1

下面是模拟你的问题的示例程序。

master.js

const cp = require('child_process'); 
const child = cp.spawn('node', ['./child.js'], {stdio: ['ipc']}) 
child.stdout.on('data', data => console.log(data.toString())) 
child.send('immediate execute MESSAGE 1') 
setTimeout(() => { 
    child.send('late execute MESSAGE 2 after 4 seconds') 
}, 4000) 

child.js

function handle(msg) { 
    console.log('Handling message -> ', msg); 
} 

process.on('message', (msg) => { 
    handle(msg); 
}); 

process.on('exit',() => { 
    process.disconnect(); 
}); 

关键的东西这里要注意的是 -

  1. child_process.spawn - 产卵返回一个缓冲区,并你可以开始听stdout str一旦孩子的过程开始,就要开始。
  2. {stdio: ['ipc']} - 此选项可让您打开带有衍生子进程的IPC通道。当您想要断开孩子时,只需使用child.disconnect()即可。