了解NodeJS和非阻塞IO

所以,我最近注入了在编程世界中快速传播的Node病毒。

我非常喜欢它的“非阻塞IO”方法,并且自己也尝试了几个程序。

但是,我目前还不了解某些概念。

我需要非专业人士的答案(来自Java背景的人)

1.multithreading与非阻塞IO。

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

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

在传统的编程语言中,上述过程是按顺序进行的。 而且,如果有多个注册请求,Web服务器创build一个新的线程,其余的是历史。 当然,程序员可以创build自己的线程同时在第2行和第3行上工作。

在Node中,据我所知,第二行和第三行将被并行运行,而程序的其余部分被执行,解释器每隔'x'ms轮询第二行和第三行。

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

2.可扩展性

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

任何人都可以解释它是如何做出这样的区别?

3.适应其他编程语言

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

我确定我错过了一些东西。 只有你能解释我,并指导我的一些链接,将是有益的。

谢谢。

一个类似的问题被问及,可能包含你正在寻找的所有信息: 单线程非阻塞IO模型如何在Node.js中工作

但是我将简要介绍一下你的3个部分:

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

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

我认为“除了你的代码之外,所有的东西都是平行的”这句话总结得很好。 例如,像“读取HTTP参数”这样的东西会按顺序执行,但是第2行和第3行中的I / O函数与添加到事件循环并稍后执行的callback相关联。 所以基本上整点就是不用等I / O。

2。
由于在1中解释的事情,节点适合于I / O密集型请求,并允许许多用户同时连接。 它是单线程的,因此对于CPU密集型任务来说,它不一定能很好地扩展。

3。
这个范例已经被用于JavaScript,因为JavaScript支持callback,事件循环和闭包,这使得这很容易。 其他语言中不一定是这样。

我可能会稍微偏离,但这是发生了什么事情的要点。

Q1。 第二行和第三行的工作在执行的其余部分是什么?“ 答:“没有”。 第2行和第3行各自开始他们各自的工作,但这些工作不能立即完成,因为(例如)所需的磁盘扇区尚未加载 – 所以操作系统发出一个调用磁盘去获得这些扇区,然后“没有任何事情发生”(节点继续执行下一个任务),直到磁盘子系统(稍后)发出一个中断来报告它们已准备好,此时节点将控制权返回到第2行和第3行。

Q2。 单线程无阻塞几乎不会为每个传入的连接贡献资源(只是关于连接的套接字的一些pipe家数据)。 这是非常有效的记忆。 传统的Web服务器“分叉”了一个全新的进程来处理每个新的连接 – 这意味着需要对每一个代码和数据variables进行大量复制,并对CPU进行时间分片处理。 这大大浪费了资源。 因此,如果你的负载是很多空闲的连接等待他们的东西,节点使负载更有意义。

Q3。 几乎所有的编程语言都已经有了非阻塞的I / O,如果你想使用它的话。 Node不是一种编程语言,它是一个运行JavaScript并使用非阻塞I / O的Web服务器(例如:我个人在Perl中写了10年前自己写的东西,就像Google(C)我相信其他人也有类似的networking服务器)。 非阻塞I / O不是最难的部分 – 让程序员理解如何使用它是棘手的一点。 因为这些程序员已经熟悉事件编程,所以Javascript恰好适用于此。

尽pipenode.js已经出现了几年,但性能模型还是有些神秘。

我最近开了一个博客,并决定node.js模型将是一个很好的第一个主题,因为我想更好地理解它自己,这将有助于其他人分享我学到的东西。 这里有几篇文章解释了高层次的概念和一些权衡:

阻塞与非阻塞I / O – 发生了什么?

了解node.js性能