我想将服务器高消耗 CPU 任务与用户体验分开:
./main.js:
var express = require('express');
var Test = require('./resources/test');
var http = require('http');
var main = express();
main.set('port', process.env.PORT || 3000);
main.set('views', __dirname + '/views');
main.use(express.logger('dev'));
main.use(express.bodyParser());
main.use(main.router);
main.get('/resources/test/async', Test.testAsync);
main.configure('development', function() {
main.use(express.errorHandler());
});
http.createServer(main).listen(main.get('port'), function(){
console.log('Express server app listening on port ' + main.get('port'));
});
./resources/test.js:
function Test() {}
module.exports = Test;
Test.testAsync = function(req, res) {
res.send(200, "Hello world, this should be sent inmediately");
process.nextTick(function() {
console.log("Simulating large task");
for (var j = 0; j < 1000000000; j++) {
// Simulate large loop
}
console.log("phhhew!! Finished!");
});
};
当请求“localhost:3000 / resources / test / async”时,我希望浏览器能够非常快地渲染“Hello world,这应该立即发送”,并且node.js继续处理,并且在一段时间后在控制台中出现“完成”消息。
相反,浏览器会一直等待,直到 Node.js 完成大型任务,然后渲染内容。我尝试过res.set({ 'Connection': 'close' });
并且res.end();
但没有任何效果按预期进行。我也用谷歌搜索过,但没有运气。
应该如何立即将响应发送给客户端并让服务器继续执行任务?
EDIT
在解决方案中发布 fork 方法
尝试等待而不是占用 CPU:
res.send("Hello world, this should be sent inmediately");
console.log("Response sent.");
setTimeout(function() {
console.log("After-response code running!");
}, 3000);
Node.js 是单线程的。如果你用一个繁忙的循环锁定CPU,整个事情就会慢慢停止,直到完成为止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)