1

以下のコードでは、processChildOne.js によってスローされる Parent.js によってエラーがキャッチされません。

// Parent.js

var cp = require('child_process');
var childOne = cp.fork('./processChildOne.js');
var childTwo = cp.fork('./processChildTwo.js');
childOne.on('message', function(m) {
    // Receive results from child process
    console.log('received1: ' + m);
});

// Send child process some work
childOne.send('First Fun');
childTwo.on('message', function(m) {
        // Receive results from child process
        console.log('received2: ' + m);
    });

    // Send child process some work
    childTwo.send('Second Fun');


// processChildOne.js

process.on('message', function(m) {
var conn = mongoose.createConnection('mongodb://localhost:27017/DB');

conn.on('error', console.error.bind(console, 'connection error:'));
// Pass results back to parent process
process.send("Fun1 complete");
});


processChildOne.js が失敗した場合、processChildOne.js と processChildTwo.js の両方が強制終了されるように、親にエラーをスローする方法。実行された子プロセスの数と、まだ保留中の子プロセスの数を追跡するにはどうすればよいでしょうか。
前もって感謝します

4

1 に答える 1

4

何が起こっているのか、子プロセスは実際にはエラーをスローしておらず、console.error に書き込みを行っているため、親プロセスでキャッチする「エラー」はありません。

子で明示的にエラーをスローすることをお勧めします。そうしないと、ライブラリによってエラーがスローされます..これにより、あなたが言及したのと同じ問題が発生しました..

node.js

var cp = require('child_process').fork('./p1.js');
cp.on('message', function(){
    console.log('ya', arguments);
})

p1.js

console.error('bad stuff man')

しかし、これは少なくとも期待どおりにエラーをスローしました

p1.js

throw "bad stuff man";

これは、クライアントでエラーをキャッチして親プロセスに送信するために機能しました。

node.js

var cp = require('child_process').fork('./p1.js');

cp.on('message', function(){
    console.log('error from client', arguments[0]);
})

p1.js
try{
    throw "bad stuff man"
} catch(e){
    process.send(e);
}

またはクライアントプロセスですべてのエラーをキャッチして親に送信する..

p1.js

process.on('uncaughtException', function(e){
    process.send(e);
})
throw "bad stuff man";

複数のプロセスを生成し、その数を追跡するには、これを実行できるはずです..

node.js

var numprocesses = 5, running = 0;

for(var i = numprocesses; i--;){

    var cp = require('child_process').fork('./p1.js');

    cp.on('message', function(pid){
        console.log('error from client', pid, arguments[0]);
    })

    cp.on('exit', function(){
        console.log('done'); 
        running--;
        console.log('number running', running, ', remaining', numprocesses-running);
    })

    running++;
}

p1.js

process.on('uncaughtException', function(e){
    process.send(process.pid + ': ' + e);
})

// simulate this to be a long running process of random length
setTimeout(function(){}, Math.floor(Math.random()*10000));

throw "bad stuff man";
于 2013-09-06T16:39:07.763 に答える