ситуация: есть функция, которая выполняет дорогостоящую операцию, такую как выборка большого запроса из mongodb, а затем выполняет большой анализ и анализ ответа.Я разгрузил эту дорогостоящую операцию на дочернюю ветку процесса и ожидаю выполнения рабочего перед отправкой ответа, чтобы не блокировать основной цикл событий.
текущая реализация: у меня есть конечная точка API GET {{backend}}/api/missionHistory/flightSummary?days=90&token={{token}}
код точки входа API:
missionReports.js
const cp = require('child_process');
//if reportChild is initailzed here, "Cant send headers after they were sent"
const reportChild = cp.fork('workers/reportWorker.js');
exports.flightSummary = function (req, res) {
let request = req.query;
// if initialized here, there is no error.
const reportChild = cp.fork('workers/reportWorker.js');
logger.debug(search_query);
let payload = {'task':'flight_summary', 'search_params': search_query};
reportChild.send(payload);
reportChild.on('message', function (msg) {
logger.info(msg);
if (msg.worker_status === 'completed')
{
return res.json(msg.data);
}
});
};
рабочий код: reportWorker.js
process.on('message', function (msg) {
process.send({'worker_status': 'started'});
console.log(msg);
switch(msg.task)
{
case 'flight_summary':
findFlightHours(msg.search_params,function (response) {
logger.info('completed')
process.send({'worker_status': 'completed', 'data':response});
})
break;
}
});
сценарий 1: reportChild (fork) инициализируется в начале определений модуля.вызов API работает один раз и возвращает правильные данные.при втором вызове происходит сбой с невозможностью отправки заголовков после их отправки.Я прошел по коду, и он определенно отправляет его только один раз за вызов API.
сценарий 2: если я инициализирую reportChild внутри определения API, он работает идеально каждый раз.Это почему?Разве дочерний процесс не уничтожен, если он не переопределен?Это стандартная реализация дочерних процессов?
Это моя первая попытка создания потока в файле node.js, я пытаюсь переместить дорогостоящие операции из цикла основного события на других работников.Дайте мне знать, что является лучшей практикой в этой ситуации.Благодаря.