了解 NodeJS 和非阻塞 IO

2022-09-02 10:37:50

所以,我最近被注射了Node病毒,它在编程世界中传播得非常快。

我对它的“非阻塞IO”方法着迷,并且确实自己尝试了几个程序。

但是,我目前无法理解某些概念。

我需要外行人的答案(来自Java背景的人)

1. 多线程和非阻塞 IO。

让我们考虑一个实际方案。比方说,我们有一个用户可以注册的网站。下面是代码。

..
..
   // Read HTTP Parameters
   // Do some Database work
   // Do some file work
   // Return a confirmation message
..
..

在传统编程语言中,上述情况以顺序方式发生。而且,如果有多个注册请求,Web 服务器将创建一个新线程,其余的都是历史记录。当然,程序员可以创建自己的线程,同时在第 2 行和第 3 行上工作。

在 Node 中,据我所知,第 2 行和第 3 行将并行运行,而程序的其余部分将执行,解释器每隔 “x” 毫秒轮询一行 2 和 3 行。

现在,我的问题是,如果Node是一种单线程语言,那么在执行程序的其余部分时,第2行和第3行的工作是什么?

2. 可扩展性

我最近读到,LinkedIn已经将Node作为其移动应用程序的后端,并看到了巨大的改进。

谁能解释一下它是如何产生如此大的影响的?

3. 适应其他编程语言

如果人们声称Node在性能方面有很大的不同,为什么其他编程语言没有采用这种非阻塞IO范式呢?

我确定我错过了一些东西。只有你能解释我并用一些链接指导我,才会有帮助。

谢谢。


答案 1

有人问了一个类似的问题,可能包含您要查找的所有信息:单线程非阻塞 IO 模型在 Node 中的工作原理.js

但是我将简要介绍您的3个部分:

1.
第 2 行和第 3 行在非常简单的形式中可能如下所示:
db.query(..., function(query_data) { ... });
fs.readFile('/path/to/file', function(file_data) { ... });

现在函数(query_data)和函数(file_data)是回调。函数 db.query 和 fs.readFile 将发送实际的 I/O 请求,但回调允许延迟处理来自数据库或文件的数据,直到收到响应。它并没有真正“轮询行2和3”。回调将添加到事件循环中,并与它们各自的 I/O 事件的某些文件描述符相关联。然后,它会轮询文件描述符,以查看它们是否已准备好执行 I/O。如果是,它将使用 I/O 数据执行回调函数。

我认为“除了你的代码之外,一切都并行运行”这句话很好地总结了这一点。例如,类似于“读取 HTTP 参数”的内容将按顺序执行,但第 2 行和第 3 行中的 I/O 函数与添加到事件循环并在以后执行的回调相关联。所以基本上重点是它不必等待I / O

2.
由于 1.中所述的内容,Node 可以很好地扩展 I/O 密集型请求,并允许许多用户同时连接。它是单线程的,因此对于 CPU 密集型任务,它不一定能很好地扩展。

3.
这个范例已经与JavaScript一起使用,因为JavaScript支持回调,事件循环和闭包,使这变得容易。这在其他语言中不一定是正确的。

我可能有点不对劲,但这是正在发生的事情的要点。


答案 2

问题 1.“在执行程序的其余部分时,第2行和第3行的工作是什么?”答:“没有”。第 2 行和第 3 行各自启动各自的作业,但这些作业无法立即完成,因为(例如)所需的磁盘扇区尚未加载 - 因此操作系统发出对磁盘的调用以获取这些扇区,然后“无所事事”(节点继续执行下一个任务),直到磁盘子系统(稍后)发出中断以报告它们已准备就绪, 此时节点将控制权返回到第 2 行和第 3 行。

问题 2.单线程非阻塞几乎不占用任何资源用于每个传入连接(只是有关已连接套接字的一些内务数据)。它非常节省内存。传统的Web服务器“分叉”了一个全新的进程来处理每个新连接 - 这意味着对所需的每一位代码和数据变量进行大量复制,并对CPU进行时间切片以处理所有这些问题。这是对资源的严重浪费。因此 - 如果你的负载是很多空闲连接等待的东西,就像他们的一样,节点使负载更有意义。

问题 3.如果你想使用它,几乎每一种编程语言都已经有了非阻塞I / O。Node不是一种编程语言,它是一个运行javascript并使用非阻塞I / O的Web服务器(例如:我个人在10年前用perl写了我自己同样的东西,就像谷歌(在C中)一样,当他们开始时,我敢肯定很多人也有类似的Web服务器)。非阻塞I / O并不是困难的部分 - 让程序员了解如何使用它是最棘手的一点。Javascript恰好可以很好地做到这一点,因为这些程序员已经熟悉事件编程。


推荐