了解NodeJS&非阻塞IO

时间:2013-08-04 06:36:43

标签: java node.js nonblocking

所以,我最近注射了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行和第2行当程序的其余部分执行时,3将并行运行,并且解释器轮询第2行和第2行。每隔'x'毫秒3。

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

2。可扩展性

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

任何人都可以解释它是如何产生这样的差异的吗?

第3。适应其他编程语言

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

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

感谢。

3 个答案:

答案 0 :(得分:13)

提出了类似的问题,可能包含您要查找的所有信息:How the single threaded non blocking IO model works in 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支持回调,事件循环和闭包,这使得这很容易。在其他语言中不一定如此。

我可能会稍微离开,但这是正在发生的事情的要点。

答案 1 :(得分:3)

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

Q2。单线程非阻塞几乎没有资源到每个传入连接(只是一些关于连接套接字的内务数据)。它的内存效率非常高。传统的Web服务器" fork"一个全新的流程来处理每个新连接 - 这意味着需要对所需的每一段代码和数据变量进行大量复制,并对CPU进行时间分片处理。这大大浪费了资源。因此 - 如果你的负载是很多等待东西的空闲连接,那么节点就会使负载更有意义。

Q3。如果你想使用它,几乎每种编程语言都有非阻塞I / O. Node不是一种编程语言,它是运行javascript并使用非阻塞I / O的Web服务器(例如:我个人在10年前在perl中编写了我自己的相同内容,谷歌(在C中)也是如此开始了,我确信其他人也有类似的Web服务器。非阻塞I / O并不是困难的部分 - 让程序员了解如何使用它是一个棘手的问题。 Javascript恰好适用于此,因为那些程序员已经熟悉事件编程。

答案 2 :(得分:1)

即使node.js已经存在了几年,它的性能模型仍然有点神秘。

我最近创建了一个博客,并认为node.js模型将是一个很好的第一个主题,因为我想自己更好地理解它,并且有助于其他人分享我学到的东西。以下是我写的几篇文章,解释了高级概念和一些权衡:

Blocking vs. Non-Blocking I/O – What’s going on?

Understanding node.js Performance