Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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中的异步操作_Javascript_Node.js_Process - Fatal编程技术网

Javascript nodejs-express中的异步操作

Javascript nodejs-express中的异步操作,javascript,node.js,process,Javascript,Node.js,Process,我有一条路线 app.get('/posts',函数(req,res){ res.json([ //资料 ]); //下面的代码会发生什么变化 //假设它正在处理一百万条记录 processMillionRecords(); }); 函数processMillionRecords(){ //处理数百万条记录 } 一旦发送响应,就会调用另一个函数,这是一个相当昂贵的操作。如果这种情况继续下去会发生什么?有什么影响吗 我知道最理想的方法是使用后台进程。所以我用下面的替换了它 res.json([

我有一条路线

app.get('/posts',函数(req,res){
res.json([
//资料
]);
//下面的代码会发生什么变化
//假设它正在处理一百万条记录
processMillionRecords();
});
函数processMillionRecords(){
//处理数百万条记录
}
一旦发送响应,就会调用另一个函数,这是一个相当昂贵的操作。如果这种情况继续下去会发生什么?有什么影响吗

我知道最理想的方法是使用后台进程。所以我用下面的替换了它

res.json([
//资料
]);
var child=require('child_process');
child.fork('worker.js');
//worker.js
函数processMillionRecords(){
//处理数百万条记录
}

在哪些情况下,哪一个更受欢迎?

节点是为处理长时间异步操作而构建的。除非它非常占用CPU,否则您可能不需要分叉一个新的工作进程。只需将processMillionRecords写入异步,并确保它不会阻止事件循环。

在上述情况下(如Timothy所述),会发生以下情况:

  • 您的应用程序将快速向用户返回数据
  • 节点进程将继续在后台运行异步代码,直到进程完成
如果您正在构建一个需要大量流量或大量CPU密集型工作负载的应用程序,最好将这些内容移动到专门用于处理长时间运行任务的单独服务器中。这降低了以下情况发生的可能性:

  • 您的web服务器重新启动--销毁您的后台处理内容
  • 您的web服务器正在处理太多的后台任务,无法正确处理传入的用户请求

希望这能有所帮助。

如果不使用后台进程,那么派生另一个进程又如何呢?是的,你是对的,也许我应该正确地重新表述这个问题。好的-我认为使用后台进程没有什么错,假设你对开销没有问题(在Node中,你没有很多选择)。如果您真的在做大量的工作,开销并不重要,因为fork只发生一次(每个工作批)。