首页 > 解决方案 > Node.js 子进程分叉返回响应 - 将标头发送到客户端后无法设置标头

问题描述

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

当前实现:我有一个 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 中使用线程,我试图将昂贵的操作从主事件循环转移到不同的工作人员中。让我知道这种情况的最佳做法是什么。谢谢。

标签: node.jsmultithreadingforkchild-process

解决方案


推荐阅读