2015-12-27 5 views
1

У меня есть задача, требующая много вычислений без ввода-вывода во время выполнения, и я не хочу блокировать поток при выполнении этой задачи. Как я могу сделать это в Node.js?Выполнение задачи с интенсивным вычислением в фоновом режиме

мне нужно что-то вроде этого:

var taskManager = require("some-background-task-lib") 

var doSomething = function() { 
    // this code will calculate something and block thread 
} 

// this line should not block the Node.js event loop, but execute in background, then call the provided function when done 
taskManager.executeInBackground(doSomething, function(err, returnValues) { 
}); 
+0

Запустите дочерний процесс. –

ответ

3

Обычный способ удалить ресурсоемких материал блокировать основной поток в Node.js должен передать эту работу к другому процессу. Существует много способов структурирования этого.

  1. Кластеризация, где у вас есть группа процессов, каждая из которых предназначена для выполнения одной и той же вещи, и каждый получает другой входящий запрос.
  2. Создайте определенный дочерний процесс, специально предназначенный для выполнения заданной задачи, и создайте этот дочерний процесс, который запускается, а затем завершается на время выполнения задачи, когда эта конкретная задача должна быть выполнена.
  3. Создайте группу дочерних процессов и очередь работы и попросите каждый дочерний процесс захватить рабочий элемент из очереди, выполнить его, передать результат, затем захватить следующий элемент из очереди и т. Д.

И эти методы могут быть объединены и один в сочетании.

В первом случае вы просто создаете больше процессов, делающих одно и то же.

В двух других случаях вы специально перемещаете интенсивную вычислительную работу на дочерние процессы, поэтому основной процесс не обременен или не блокируется этой работой.

Существует ряд библиотек, которые помогают обеспечить интерфейс для использования дочерних процессов. Одна такая библиотека предоставляет webWorker type of interface.

+0

Есть ли у вас какие-либо внешние ссылки, если у вас есть какие-либо методы, которые более подробно описывают, как эти вещи выполняются? Очень любопытно, как это делается! По детским процессам я думаю, что асинхронные вызовы на другой экспресс-сервер/etc, который вычисляет логику. Не уверен, что я ухожу ... @ jfriend00 –

+0

@MarkPieszak - Основная библиотека дочерних процессов для node.js находится здесь: https://nodejs.org/api/child_process.html. Я уже предоставил вам ссылку (в моем ответе) в библиотеку интерфейса webWorker. Есть буквально сотни модулей, написанных для решения таких проблем. Что использовать зависит от специфики вашей ситуации, которую вы не разделяли. – jfriend00

+0

Удивительное спасибо! У меня много чтения впереди меня. Я не OP, просто любопытный и более учущий Узел в прошлом году более агрессивно. Спасибо друг! –

0

Вам нужны фоновые работники и какой-то коммуникационный протокол между вашим веб-экземпляром и рабочими экземплярами. Например, вы можете использовать kue для создания очереди задач

// web worker 
var kue = require('kue'); 
var queue = kue.createQueue(); 

.... 

app.post('/calculateSomeCrazyStuff', (req, res, err) => { 
    queue.create('myLongRunningJobName1', { 
    fibonacciSequence: 52 
    }).save((err) => { 
    if (err) { 
     return next(err); 
    } 
    res.status(204).send(); 
    }); 
}); 



// jobs worker 
var kue = require('kue'); 
var queue = kue.createQueue(); 


queue.process('myLongRunningJobName1', function(job, done) { 
    // calculate fibonacci 
    done(); 
});