2017-02-27 14 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

このコードはどのように実行されますか? exitと言うと、プログラム自体は終了しますか?これはスタンドアロンのスクリプトですか、サーバーですか?あなたが 'message'イベント(https://nodejs.org/api/process.html#process_event_message)のドキュメンテーションをチェックすれば、ノードプロセスが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を聞き始めることができます子プロセスが開始されるとすぐにeamします。
  2. {stdio: ['ipc']} - このオプションを使用すると、生成された子プロセスでIPCチャネルを開くことができます。子供を切断したいときは、単にchild.disconnect()を使います。
関連する問題