所以,我最近被注射了Node病毒,它在编程世界中传播得非常快。
我对它的“非阻塞IO”方法很着迷,我自己也确实尝试过几个程序。
不过,我现在并不明白某些概念。
我需要外行的答案(有Java背景的人)
1.多线程和非阻塞IO.
让我们考虑一个实际的场景。比方说,我们有一个用户可以注册的网站。下面是代码。
..
..
// Read HTTP Parameters
// Do some Database work
// Do some file work
// Return a confirmation message
..
..
在传统的编程语言中,上述操作是按顺序进行的。而且,如果有多个注册请求,web服务器会创建一个新线程,剩下的就是历史记录。当然,程序员可以创建自己的线程来同时在第二行和第三行工作。
据我所知,在Node中,第2行和第3行将并行运行,而程序的其余部分将被执行,解释器每隔'x‘ms轮询第2行和第3行。
现在,我的问题是,如果Node是单线程语言,那么在执行程序的其余部分时,第2行和第3行的工作是什么?
2.可伸缩性
我最近读到LinkedIn已经将Node调整为其移动应用的后端,并看到了巨大的改进。
有谁能解释一下它是如何造成如此大的不同的?
3.适应其他编程语言
如果人们声称Node在性能方面有很大的不同,为什么其他编程语言没有采用这种非阻塞IO范例?
我肯定我漏掉了什么。只有如果你能解释我和指导我与一些链接,将是有帮助的。
谢谢。
发布于 2014-12-12 20:48:34
Q1。“当程序的其余部分正在执行时,第2行和第3行的作业是什么?”答案是:“什么都没有”。第2行和第3行各自开始各自的作业,但这些作业不能立即完成,因为(例如)所需的磁盘扇区尚未加载-因此操作系统向磁盘发出调用以获取这些扇区,然后“什么也没有发生”(节点继续执行其下一个任务),直到磁盘子系统(稍后)发出中断以报告它们已准备就绪,此时节点将控制权返回到第#2和#3行。
Q2。单线程非阻塞几乎不会为每个传入连接提供任何资源(只有一些关于连接的套接字的内务数据)。它的内存效率非常高。传统的web服务器会“分叉”一个全新的进程来处理每个新的连接--这意味着对所需的每一位代码和数据变量进行巨大的复制,并对CPU进行时间切片以处理所有这些问题。这是对资源的巨大浪费。因此--如果你的负载是大量等待处理的空闲连接,就像他们的负载一样,那么node会让负载变得更有意义。
Q3。如果你想使用非阻塞I/O,几乎每种编程语言都已经有了它。Node不是一种编程语言,它是一种运行javascript并使用非阻塞I/O的web服务器(例如: 10年前我个人用perl编写了相同的东西,就像google ( C)刚开始时一样,我相信很多其他人也有类似的web服务器)。非阻塞I/O并不是最难的部分-让程序员理解如何使用它才是棘手的部分。Javascript恰好可以很好地实现这一点,因为这些程序员已经熟悉事件编程。
发布于 2015-10-10 05:46:36
尽管node.js已经存在了几年,但它的性能模型仍然有点神秘。
我最近开了一个博客,并决定node.js模型将是一个很好的第一个主题,因为我想更好地理解它,它将有助于其他人分享我所学到的东西。以下是我写的几篇文章,解释了高级概念和一些权衡:
https://stackoverflow.com/questions/18040366
复制相似问题