2015-01-27 4 views
0

Я разворачиваю дочерний процесс в серверном приложении, которое выполняет некоторую повторяющуюся работу с процессором, значение статуса пересылается на Redis на каждой итерации.Данные Redis не отображаются до тех пор, пока Node.js child_process.fork() не завершится

Проблема заключается в том, что значение статуса не отображается в Redis до тех пор, пока дочерний процесс не завершится, поэтому я могу получить только последнее значение статуса.

Я проверяю значение статуса в клиентском приложении.

Я использую node_redis как клиент Redis.

Я проверил несуществование значений статуса до завершения дочернего процесса из redis-cli.

родитель (сервер приложений):

child_process.fork('child.js') 

ребенок (сервер приложений):

for (...) { 
    //CPU-bound work 
    redisClient.hset(key, field, value) 
} 

клиент приложение:

(function poll() { 
    //wait 
    redisClient.hget(key, field) 
    poll() 
})() 

ответ

0

Попробуйте изменить Ваш ребенок код

async.eachSeries(data, function(element, next) { 
    //do cpu bound work on element 
    redisClient.hset(key, field, value, next); // wait for callback before starting next work 
}, function(err) { 
    console.log('done'); 
}); 

Если вы не ждать команды обратного вызова, что H Установите происходит это цикл будет просто продолжать идти и не получит возможность обновить свой статус. Возможно, вам понадобится использовать лучший метод async. * Для ваших нужд.

+0

Исправлено простым использованием обратных вызовов команд Redis. Просто я увидел ваше предложение использовать асинхронную библиотеку, я не думаю, что мне это нужно в моей ситуации. В любом случае спасибо! –