Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs和Express,从工作线程使用res.send()_Javascript_Node.js_Express_Worker Thread - Fatal编程技术网

Javascript Nodejs和Express,从工作线程使用res.send()

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(“退出”,代码=

在Nodejs中,使用Express作为服务器,我将繁重的计算卸载到工作线程上

在主应用程序中,我这样调用工作线程:

//文件: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我没有找到直接从工作线程发送的方法。请看我的答案,了解我最终是如何解决问题的。