Node.js以并发而闻名,然而,我对如何使它同时工作感到困惑。我很快就逐一启动了Chrome的两个请求,我预计控制台中的输出应该是:
- “获得新请求”
- 在我的第二次请求之后立即打印“获取新请求”
- 几秒钟后,“结束新请求”
- 几秒钟后,“结束新请求”
醇>
但是,我看到的是:
- “获得新请求”
- 几秒钟后,“结束新请求”
- “获得新请求”
- 几秒钟后,结束新请求
醇>
这意味着第二个请求在第一个请求完成之前不会被处理。以下是我的示例代码,我错过了什么?
var http = require("http");
var url = require("url");
function start(route) {
http.createServer(function(request, response) {
console.log('get a new request');
// a time consuming loop
for (var i=0; i<10000000000; ++i) {
}
route(url.parse(request.url).pathname);
response.writeHead(200, {"Content-Type": "text/plain"});
response.end();
console.log('end the new request');
}).listen(5858);
}
function saySomething(something) {
console.log(something);
}
exports.start = start;
exports.saySomething = saySomething;
答案 0 :(得分:3)
您无需做任何事情。
它基于非阻塞I / O.简而言之,有一个事件循环。运行一组同步代码,完成后,运行下一次迭代,选择要运行的下一组同步代码。无论何时运行异步操作(db fetch,setTimeout,读取文件等),都会运行事件循环的下一个滴答。这种方式永远不会有任何代码等待。
没有线程。在你的例子中,for循环是一个连续的代码块,所以js将运行整个for循环,然后才能处理另一个http请求。
尝试在for循环周围放置一个setTimeout,以便节点可以切换到下一个事件循环,并在您的情况下处理Web请求。
答案 1 :(得分:2)
节点无法处理这些:
for (var i=0; i<10000000000; ++i) {}
兼任。但它同时处理IO
答案 2 :(得分:1)
答案 3 :(得分:-1)
这是预期的行为,̶我们称这种̶̶b̶l̶o̶c̶k̶i̶n̶g̶
,该溶液用于处理并发请求是使代码̶̶n̶o̶n̶-̶b̶l̶o̶c̶k̶i̶n̶g̶
,一旦你打电话̶{{1 ̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶{̶r̶e̶s̶p̶o̶n̶s̶e̶.̶w̶r̶i̶t̶e̶H̶e̶a̶d̶
<。
编辑7/8/14: 不得不最近处理这个问题,发现你可以使用线程: https://www.npmjs.org/package/webworker-threads
Webworker-threads为Node.js中缺少的CPU绑定任务提供异步API:
̶r̶e̶s̶p̶o̶n̶s̶e̶.̶e̶n̶d̶
它不会阻止事件循环,因为对于每个请求,fibo worker将在一个单独的后台线程中并行运行。