gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:16:41 26 4
gpt4 key购买 nike

首先,我想了解什么是 Node.Js。我有两个问题。

第一个问题
来自 the article 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");

如果同时收到两个客户端请求,则表示如下工作流程:

  1. 收到第一个 http 请求事件,收到第二个请求事件。
  2. 一旦收到第一个事件,就会执行第一个事件的回调函数。
  3. 此时,第二个事件的回调函数必须等待。

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

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

An event loop - or main loop, is a construct within programs that controls and dispatches events following an initial event.

The initial event can be anything, including pushing a button on a keyboard or clicking a button on a program (in Node.js, I think the initial events will be http request, db queries or I/O file access).

This is called a loop, not because the event circles and happens continuously, but because the loop prepares for an event, checks the event, dispatches an event and repeats the process all over again.

我对第二段有冲突,尤其是“repeat the process all over again”这句话。我接受上述问题中的上述 http.createServer 代码绝对是“事件循环”,因为它反复监听 http 请求事件。

但我不知道如何识别以下代码是事件驱动还是事件循环。除了 db 查询完成后触发的回调函数之外,它不会重复任何内容。

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

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

最佳答案

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

另外,请记住,在技术世界中没有“同时”这样的东西。一切都有非常具体的地点和时间。

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

线程 - 很昂贵,线程的服务器容量与可用内存直接相关。因此,大多数经典 Web 应用程序都会受到影响,因为 RAM 用于在有数据库查询 block 或类似情况时简单空闲的线程上。在 Node 中,情况并非如此。

不过,它允许通过 cluster 创建多个线程(作为 child_process) ,这扩展了更多的可能性。

回答二。没有您可能想到的“循环”之类的东西。幕后不会有任何循环来检查是否有连接或接收到任何数据等等。现在它也由 Async 方法处理。

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

如果使用 http.createServer,您可以将回调绑定(bind)为对请求的响应。所有的套接字操作和 IO 东西都将在幕后发生,以及 HTTP 握手、解析 header 、查询、参数等。一旦它在幕后发生并且工作完成,它将保留数据并将回调推送到带有一些数据的事件循环。一旦事件循环空闲并且到了时间,它将在 node.js 应用程序上下文中执行您的回调,并使用来自幕后的数据。

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

说实话,使用 node.js 所需要的只是理解概念,而不是事件的实现。最好的方法是实验。

关于node.js - Node.js 中的单线程和事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com