Nay*_*ung 11 event-loop node.js
首先,我是尝试了解什么是Node.Js. 我有两个问题.
第一个问题
从Felix 的文章中,它说"在同一时间只能有一个回调触发.在回调完成执行之前,所有其他回调都必须排队".
然后,考虑以下代码(从nodejs官方网站复制)
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
Run Code Online (Sandbox Code Playgroud)
如果同时收到两个客户端请求,则表示以下工作流程:
我对吗?如果我是对的,如果在很短的时间内有数千个客户端请求,Node.js如何控制.
第二个问题
术语"事件循环"主要用于Node.js主题.我已经明白"事件循环"从下面的http://www.wisegeek.com/what-is-an-event-loop.htm ;
事件循环 - 或主循环,是程序中的一个构造,用于控制和分派初始事件后的事件.
初始事件可以是任何东西,包括按下键盘上的按钮或单击程序上的按钮(在Node.js中,我认为初始事件将是http请求,数据库查询或I/O文件访问).
这称为循环,不是因为事件循环并且连续发生,而是因为循环准备事件,检查事件,调度事件并重新重复该过程.
我对第二段有冲突,特别是" 重复这个过程 "这句话.我接受上面的问题上面的http.createServer代码绝对是"事件循环",因为它反复监听http请求事件.
但我不知道如何识别以下代码,无论是事件驱动还是事件循环.除了在db查询完成后触发的回调函数之外,它不会重复任何操作.
database.query("SELECT * FROM table", function(rows) {
var result = rows;
});
Run Code Online (Sandbox Code Playgroud)
请让我听听你的意见和答案.
回答一,你的逻辑是正确的:第二个事件将等待.并且将执行其排队的回调时间到来.
同样,请记住技术世界中没有"同时"这样的东西.一切都有非常具体的地点和时间.
node.js管理数千个连接的方式是,在有一些数据库调用阻塞逻辑或者正在处理另一个IO操作(例如流)时,不需要保持线程空闲.它可以"提供"第一个请求,可能会创建更多回调,然后继续进行其他操作.
因为没有办法阻止执行(除了废话(真实)和类似),它在整个应用程序逻辑中传播实际资源变得非常有效.
线程 - 价格昂贵,线程的服务器容量与可用内存直接相关.因此,大多数经典Web应用程序都会受到影响,因为在数据库查询块正在进行或类似的情况下,RAM用于简单空闲的线程.在节点中不是一个案例.
它仍然允许创建多个线程(作为child_process)cluster,这扩展了更多的可能性.
答案二.没有你想到的"循环"这样的东西.幕后没有循环可以检查是否有连接或接收到任何数据等等.现在它也由Async方法处理.
因此从应用程序的角度来看,没有"主循环",从开发人员的角度来看,一切都是事件驱动的(不是事件循环).
如果是http.createServer,则将回调绑定为对请求的响应.所有套接字操作和IO内容都将在幕后发生,以及HTTP握手,解析标头,查询,参数等.一旦它在幕后发生并且工作完成,它将保留数据并将回调推送到具有一些数据的事件循环.一旦事件循环生效并且将到来它将在node.js应用程序上下文中执行您的回调与来自幕后的数据.
随着数据库请求 - 同样的故事.它不准备并询问内容(可能会再次执行异步),然后在数据库响应并将为应用程序上下文准备数据时进行回调.
说实话,node.js所需要的只是理解概念,而不是事件的实现.最好的方法 - 实验.
| 归档时间: |
|
| 查看次数: |
3481 次 |
| 最近记录: |