Javascript Nodejs和Express,从工作线程使用res.send()
在Nodejs中,使用Express作为服务器,我将繁重的计算卸载到工作线程上 在主应用程序中,我这样调用工作线程:Javascript Nodejs和Express,从工作线程使用res.send(),javascript,node.js,express,worker-thread,Javascript,Node.js,Express,Worker Thread,在Nodejs中,使用Express作为服务器,我将繁重的计算卸载到工作线程上 在主应用程序中,我这样调用工作线程: //文件:main.js const{Worker}=require(“Worker_线程”); 函数runService(文件名,workerData){ 返回新承诺((解决、拒绝)=>{ const-worker=新的worker(文件名,{workerData}); 工作人员。打开(“消息”,解决); 工作人员。打开(“错误”,拒绝); worker.on(“退出”,代码=
//文件:main.js
const{Worker}=require(“Worker_线程”);
函数runService(文件名,workerData){
返回新承诺((解决、拒绝)=>{
const-worker=新的worker(文件名,{workerData});
工作人员。打开(“消息”,解决);
工作人员。打开(“错误”,拒绝);
worker.on(“退出”,代码=>{
如果(代码!==0)
拒绝(新错误(`Worker stopped with exit code${code}`);
});
});
}
router.get(“/some_url”),异步函数(req,res){
const result=等待运行服务(
“/path/to/worker.js”,
{query:req.query,user:req.user}//使用{req}会导致错误
);
});
工人看起来像这样:
//文件:worker.js
const{workerData,parentPort}=require('worker_threads');
const{query,user}=workerData;
异步函数run(){
const result=wait generateLotsOfData(查询,用户);
parentPort.postMessage(结果);
//我想在这里做什么(不起作用):res.send(result);
}
工作程序生成大量数据,“postMessage”会导致服务器错误
是否有一种方法可以使用res.send()
或类似的方法将此数据从工作线程直接发送到客户端?(而不是使用
postMessage
然后从主线程发送)似乎不可能直接从工作线程发送到客户端。最后,我使用了子进程(而不是工作进程),并将结果发送回主进程,然后发送到客户端
//文件:main.js
var child_process=require('child_process');
//运行辅助线程
函数runService(文件名,workerData){
返回新承诺((解决、拒绝)=>{
const worker=child_process.fork(文件名);
worker.on('message',函数(message){
if(message.ready){
//工人已准备好接收数据
worker.send(workerData);
}否则{
//工人完成计算后,将数据发送到客户机
解析(消息);
}
});
worker.on(“错误”,函数(x){
console.log('error',x);
解决({状态:500});
});
工作模式开启(“关闭”,功能(y){
控制台日志(“关闭”,y);
});
worker.on(“退出”,函数(代码){
如果(代码==0){
log('report run successfully');
}否则{
console.log(“报告失败”);
解决({状态:500});
}
});
});
}
在工人中:
process.on('message',run);
send({ready:true});
异步函数运行(workerData){
试一试{
const result=doSomeCalculations();
进程发送({
数据:JSON.stringify(结果)
},null,{},function(){process.exit(0)});
}捕捉(错误){
控制台错误(err);
process.exit(1);//退出失败的进程
}
}
//确保此子进程不会意外地留在内存中。
//10分钟后杀死。(不确定这是否必要,只是为了确定)
setTimeout(函数(){
log('子进程超时');
过程。退出(1);
}, 600000);
这实际上非常有效。streams会有帮助吗?不确定您的具体用例,您应该能够使用res.write()来流式处理值,如下所示:在使用res.write()之前,我仍然需要将数据从工作线程发送到主线程。Streams可能仍然有用,因为我每次都要发送Les数据。你找到解决方案@HendrikJan了吗?我面临着类似的问题。@lukas1994我没有找到直接从工作线程发送的方法。请看我的答案,了解我最终是如何解决问题的。