一尘不染

Node.js中的单线程和事件循环

node.js

首先,我开始尝试了解什么是Node.Js。我有两个问题。

第一个问题
文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。

然后,考虑以下代码(从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");

如果同时收到两个客户端请求,则意味着以下工作流程:

  1. 收到第一个http请求事件,收到第二个请求事件。
  2. 收到第一个事件后,将立即执行第一个事件的回调函数。
  3. 同时,第二个事件的回调函数必须等待。

我对吗?如果我是对的, Node.js 如何控制在很短的时间内是否有成千上万的客户端请求。

第二个问题
术语“事件循环”主要在Node.js主题中使用。我从http://www.wisegeek.com/what-is-an-event-
loop.htm了解了以下“事件循环” ;

事件循环(或主循环)是程序内的一种构造,用于控制和分配初始事件后的事件。

初始事件可以是任何东西,包括按键盘上的按钮或单击程序上的按钮(在Node.js中,我认为初始事件将是http请求,数据库查询或I / O文件访问)。

这被称为循环,不是因为事件绕圈并连续发生,而是因为循环为事件做准备,检查事件,调度事件并再次重复该过程。

我对第二段有一个冲突,特别是短语“ 从头再来 ”。我接受上述问题中的上述 http.createServer
代码绝对是“事件循环”,因为它反复侦听http请求事件。

但是我不知道如何将以下代码识别为事件驱动还是事件循环。除了在数据库查询完成后触发的回调函数外,它不会重复任何操作。

database.query("SELECT * FROM table", function(rows) {
  var result = rows;
});

请让我听听您的意见和答案。


阅读 258

收藏
2020-07-07

共1个答案

一尘不染

回答一个 ,您的逻辑是正确的:第二个事件将等待。并且将在其排队的回调时间到来之前执行。

同样,请记住,技术世界中没有“同时”这样的事情。一切都有非常特定的时间和地点。

node.js管理成千上万个连接的方式是,当有一些数据库调用阻塞逻辑,或者正在处理另一个IO操作(例如流)时,无需保持线程空闲。它可以“服务”第一个请求,也许创建更多的回调,然后继续处理其他请求。
因为没有办法阻止执行(无用的while(true)和类似的东西除外),所以在整个应用程序逻辑上分配实际资源变得非常有效。

线程-
昂贵,线程的服务器容量与可用内存直接相关。因此,大多数经典的Web应用程序都将遭受苦难,因为仅在存在数据库查询块或类似事件的情况下,空闲的线程上使用了RAM。在节点中,情况并非如此。

尽管如此,它仍允许通过创建多个线程(作为child_process)cluster,从而扩展了更多可能性。

回答二 。您可能不会想到“循环”之类的东西。幕后将不会有循环来检查是否有连接或接收到的任何数据,等等。如今,异步方法也可以处理它。

因此,从应用程序的角度来看,没有“主循环”,而从开发人员的角度来看,一切都是事件驱动的(不是事件循环)。

如果使用http.createServer,则将回调绑定为对请求的响应。所有套接字操作和IO事务以及HTTP握手,解析标头,查询,参数等都将在幕后发生。一旦它在后台发生并且完成了工作,它将保留数据,并将回调与某些数据一起推送到事件循环。一旦事件循环变得免费并且将要到时,它将在node.js应用程序上下文中执行您的回调,其中包含来自幕后的数据。

与数据库请求-同样的故事。它会准备和询问问题(甚至可能再次异步),然后一旦数据库响应并且将为应用程序上下文准备数据,就会回调。

坦白地说,使用node.js所需要做的只是了解概念,而不是了解事件的实现。 最好的方法-实验。

2020-07-07