Node.js子进程fork return response--无法在将头发送到客户端后设置头

Node.js子进程fork return response--无法在将头发送到客户端后设置头,node.js,multithreading,fork,child-process,Node.js,Multithreading,Fork,Child Process,情况: 拥有一个执行昂贵操作的函数,例如从mongodb获取一个大型查询,然后对响应执行大量解析和分析。我已经将这个昂贵的操作卸载到一个子进程fork,并在发送响应之前等待工作进程完成,以便不阻塞主事件循环 当前实施: 我有一个API端点GET{{backend}/API/missionHistory/flightSummary?days=90&token={{token} api入口点代码: 任务报告.js const cp = require('child_process'); //if r

情况: 拥有一个执行昂贵操作的函数,例如从mongodb获取一个大型查询,然后对响应执行大量解析和分析。我已经将这个昂贵的操作卸载到一个子进程fork,并在发送响应之前等待工作进程完成,以便不阻塞主事件循环

当前实施: 我有一个API端点
GET{{backend}/API/missionHistory/flightSummary?days=90&token={{token}

api入口点代码:

任务报告.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:如果我在api定义中初始化reportChild,它每次都能正常工作。为什么呢?除非重新定义子分叉进程,否则它不会被终止吗?这是子过程的标准实现吗

这是我第一次尝试在node.js中线程化,我试图将昂贵的操作从主事件循环转移到不同的工作线程中。让我知道什么是这种情况下的最佳做法。谢谢