2014-02-18 3 views
1

Я хотел бы вызвать функцию через setTimeout, используя дочерний процесс, который может выйти до появления setTimeout.Вызов setTimeout из дочернего процесса (NodeJS)

1) Я предполагаю, что если дочерний процесс вызывает функцию (даже если она определена извне), setTimeout будет отменен, если дочерний процесс завершится. Это верно?

2) Если да, то возможно ли, чтобы дочерний процесс сигнализировал родительскому процессу о выполнении setTimeout, или есть лучший способ достичь этого?

Спасибо!

ответ

0

Я не уверен, что полностью понимаю, но позвольте мне предоставить некоторые потенциально применимые ссылки и примеры.

Отправка и получение сообщений между основным и дочерним процессом возможны с child.send/process.send, который является частью модуля и кластера child_process.

Например, очищая SetTimeout, когда дочерний процесс отправляет сообщение мастеру:

var cp = require('child_process'); 
var child = cp.fork(__dirname + '/sub.js'); 

var timer = setTimeout(function(){ 
    console.log('timed out'); 
}, 5000); 

child.on('message', function(msg) { 
    console.log(msg); 
    clearTimeout(timer); 
}); 

Ребенок

setTimeout(function() { 
    console.log('finished doing some long task'); 
    process.send({ status: 'done' }); 
}, 3000); // set this to something larger than 5000ms to see the timeout 

Вы также можете быть заинтересованы в exit и close событие для дочерний процесс, чтобы сделать что-то подобное.

+0

Благодарим вас за это. В первую очередь меня интересует поведение setTimeout, вызванное процессом после завершения процесса. Я предполагаю, что это не выполняется, поэтому я пытаюсь найти способ вызова дочернего процесса setTimeout, который выполняется независимо от того, существует ли дочерний процесс, когда нужно запустить setTimeout. – erythraios

+0

Хм .. в представленном примере показано, как вы можете запускать setTimeout независимо от существования дочернего элемента, но в отношении того, чтобы запуск setTimeout изнутри дочернего элемента оставался после выхода из него, я не считаю, что это возможно, поскольку процесс, запускающий таймер, больше не работает. Единственный способ - в каком-то процессе, родительском или другом ребенке, который остается. –

+0

Вот что я подумал. Итак, теперь мне интересно, смогу ли я достичь этого, отправив сообщение родителю, которое, в свою очередь, выполняет setTimeout. Есть ли лучший способ, чем это? – erythraios

Смежные вопросы