Node.js是否真的异步执行后台I / O任务?
编辑:我们可以关闭。 Isn't truly asynchronous, non-blocking javascript impossible?
var PATH = require ("path");
var URL = require ("url");
var sleep = function (ms){
var start = new Date ().getTime ();
while ((new Date ().getTime () - start) < ms);
}
require ("http").createServer (function (req, res){
if (URL.parse (req.url).pathname === "/1"){
console.log ("tab 1: I'm in");
PATH.exists ("test", function (exists){
sleep (5000);
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("1");
console.log ("tab 1: I'm done");
});
}else{
console.log ("tab 2: I'm in");
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("2");
console.log ("tab 2: I'm done");
}
}).listen (80);
- 将内容复制到文件中。
- 执行文件。
- 在浏览器中打开一个新标签。将URL设置为
localhost/1
。不要走。 - 在浏览器中打开一个新标签。将URL设置为
localhost/2
。不要走。 - 返回第一个标签。按Enter键,然后在切换到第二个选项卡后立即按Enter键。
结果:
控制台日志:
标签1:我在选项卡1:我完成了标签2:我在标签2:我完成了
选项卡1等待5秒以接收结果“ 1”。
- 选项卡2也必须等待5秒,因为选项卡1处于休眠状态5秒钟。
文档说,除了代码外,其他所有内容都是异步的。只有一个线程。一次仅一个请求。请求入队。
I / O调用应该是异步的,对吗?那么,如果回调来自异步I / O进程,为什么选项卡2必须等待选项卡1?
谢谢。
编辑:我们可以关闭。真正异步,非阻塞的JavaScript并非不可能吗? var PATH = require(“ path”); var URL = require(“ url”); var sleep = function(ms){var start = new Date()....
回答如下:因为您的sleep
阻止了事件循环。
Node.js是否真的异步执行后台I / O任务?
编辑:我们可以关闭。 Isn't truly asynchronous, non-blocking javascript impossible?
var PATH = require ("path");
var URL = require ("url");
var sleep = function (ms){
var start = new Date ().getTime ();
while ((new Date ().getTime () - start) < ms);
}
require ("http").createServer (function (req, res){
if (URL.parse (req.url).pathname === "/1"){
console.log ("tab 1: I'm in");
PATH.exists ("test", function (exists){
sleep (5000);
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("1");
console.log ("tab 1: I'm done");
});
}else{
console.log ("tab 2: I'm in");
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("2");
console.log ("tab 2: I'm done");
}
}).listen (80);
- 将内容复制到文件中。
- 执行文件。
- 在浏览器中打开一个新标签。将URL设置为
localhost/1
。不要走。 - 在浏览器中打开一个新标签。将URL设置为
localhost/2
。不要走。 - 返回第一个标签。按Enter键,然后在切换到第二个选项卡后立即按Enter键。
结果:
控制台日志:
标签1:我在选项卡1:我完成了标签2:我在标签2:我完成了
选项卡1等待5秒以接收结果“ 1”。
- 选项卡2也必须等待5秒,因为选项卡1处于休眠状态5秒钟。
文档说,除了代码外,其他所有内容都是异步的。只有一个线程。一次仅一个请求。请求入队。
I / O调用应该是异步的,对吗?那么,如果回调来自异步I / O进程,为什么选项卡2必须等待选项卡1?
谢谢。
编辑:我们可以关闭。真正异步,非阻塞的JavaScript并非不可能吗? var PATH = require(“ path”); var URL = require(“ url”); var sleep = function(ms){var start = new Date()....
回答如下:因为您的sleep
阻止了事件循环。