当前位置: 首页 > 面试题库 >

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

丁阳羽
2023-03-14
问题内容

首先,我开始尝试了解什么是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;
});

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


问题答案:

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

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

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

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

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

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

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

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

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

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



 类似资料:
  • 问题内容: Node.JS的最大优点是它具有非阻塞性。它是单线程的,因此不需要为每个新的传入连接生成新的线程。 在事件循环(实际上是单线程)的后面,有一个“非阻塞工作程序”。这个东西不再是单线程的,所以(据我了解),它可以为每个任务产生一个新线程。 也许我误会了一些东西,但是优势到底在哪里。如果要处理的任务很多,那么“非阻塞工作”会不会变成“阻塞工作人员”? 谢谢克里斯蒂安 问题答案: 您需要阅读

  • 我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现

  • 本文向大家介绍Node.js事件循环(Event Loop)和线程池详解,包括了Node.js事件循环(Event Loop)和线程池详解的使用技巧和注意事项,需要的朋友参考一下 Node的“事件循环”(Event Loop)是它能够处理大并发、高吞吐量的核心。这是最神奇的地方,据此Node.js基本上可以理解成“单线程”,同时还允许在后台处理任意的操作。这篇文章将阐明事件循环是如何工作的,你也可

  • 主要内容:事件驱动程序,实例,Node 应用程序是如何工作的?Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

  • 问题内容: Node.js I / O事件循环是单线程还是多线程? 如果我有多个I / O进程,则节点会将它们置于外部事件循环中。它们是按顺序处理(最快),还是处理事件循环以同时处理它们(…以及哪些限制)? 问题答案: 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。Nodejs本身在libuv之下使用了许多线程,但是您在编写nodejs代码时不

  • Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发