Gab*_*mas 0 javascript asynchronous http node.js
编辑:我们可以关闭.是不是真的异步,非阻塞javascript不可能?
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);
Run Code Online (Sandbox Code Playgroud)
localhost/1.不要走了.localhost/2.不要走了.结果:
控制台日志:
选项卡1:我在
选项卡1中:我已完成
选项卡2:我在
选项卡2中:我已经完成了
标签1等待5秒钟以接收结果"1".
文档说除了代码之外所有都是异步的.只有一个线程.一次只能有一个请求.请求已入队.
I/O调用应该是异步的,对吧?那么,如果回调来自异步I/O进程,为什么选项卡2必须等待选项卡1?
谢谢.
小智 5
因为你sleep阻止了事件循环.
替换它setTimemout(function() { /* Code to run */ }, 5000);并/2立即回应.
实际的I/O是异步的,但是您在I/O上执行的所有操作都发生在事件循环中.如果某事阻止事件循环,其他一切都必须等待,就像你说的那样.
编辑.为了更清楚,请查看以下ASCII图形:
Event Loop Thread: ------+req1HandlerExistsCall+-------+req1Wait5Sec++++++++++++++++++++++++++req2ExistsCall+-------+req2Immediate+-------------
HTTP I/O: -+req1+--------------------------------------+req2+--------------------------------------+req1Response+--------+req2Response+
File I/O: ----------------------------+exists1+----------------------------------------------------+exists2+---------------------------
Run Code Online (Sandbox Code Playgroud)
基本上,每个线程一次只能有一个.因为第一个请求处理程序会阻塞5秒钟(并且在速度测试中用手指敲打文件系统基本上是不可能的),所以在第一个请求几乎完成之前,第二个响应甚至都没有开始处理.
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |