node.js - 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 中使用线程,我试图将昂贵的操作从主事件循环转移到不同的工作人员中。让我知道这种情况的最佳做法是什么。谢谢。
解决方案
推荐阅读
- python-3.x - 在 tkinter 画布中鼠标指针之后出现在画布对象中的问题
- javascript - 使用角度js问题加载日期年日下拉
- react-query - 我的 useQuery 钩子每次调用时都会重新获取。我认为应该交回缓存?
- r - 在 genlight 对象中导入记录的基因型表
- android - 带有 FragmentContainerView 的未知属性类警告
- sql-server - GETDATE() 输出中的最后一个 .mmm 是什么
- email - Microsoft Graph 发送电子邮件错误“访问被拒绝”
- c - getrlimit -1 返回值
- html - 如何防止兄弟元素堆叠?
- json - 如果不存在则创建表并插入行,否则只需插入