所以,我最近被注射了 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 范例呢?
我确信我错过了一些东西。只有您能解释我并通过一些链接指导我,才会有帮助。
Thanks.
有人提出了类似的问题,并且可能包含您正在寻找的所有信息:单线程非阻塞 IO 模型在 Node.js 中的工作原理 https://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js
但我将简要介绍您的三个部分:
1.
第 2 行和第 3 行的非常简单的形式可能如下所示:
db.query(..., 函数(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 支持回调、事件循环和闭包,这使得这一切变得容易。这在其他语言中不一定成立。
我可能有点偏离,但这就是正在发生的事情的要点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)