我读到 javascript 语言具有有助于实现非阻塞 IO 的特性,这有助于node.js等项目的成功。我的问题是这些特征是什么,为什么非阻塞 IO 在其他语言中实现起来更棘手?
4 回答
JavaScript 本身不提供非阻塞 IO。node.js 使用的底层系统调用执行非阻塞 IO。JavaScript 的一流函数意味着当 IO 完成时很容易传递回调。
其他语言可以做非阻塞 IO 就好了。node.js 只是认为回调使推理和处理非阻塞操作变得超级容易。
Ruby 有 EventMachine,它传递块而不是函数。C 可以使用函数指针进行非阻塞 IO,但是你不会得到闭包,所以这有点痛苦。
javascript 有时被标记为非阻塞 IO 的原因是因为匿名定义(基于事件)函数的概念。Node.js 专门将此标记为他们为什么 javascript 是一种良好的服务器端语言的原因。然而,这只是一半的事实,因为它在技术上不是非阻塞的,但它会在等待来自匿名回调/ajax 函数的回调时继续执行代码。我不确定这是否是您阅读的内容,但一个 Node 教程中提供的解释是:
“另一种方法,Node 和一些极快的现代服务器(如 Nginx 和 Thin)采用的方法是使用带有事件循环的单个非阻塞线程。这是使用 JavaScript 的决定真正闪耀的地方,因为 JavaScript 是设计用于单线程基于事件循环的环境:浏览器。JavaScript 传递闭包的能力使基于事件的编程变得非常简单。您基本上只需调用一个函数来执行某种类型的 I/O 并传递一个回调函数和 JavaScript 会自动创建一个闭包,确保即使在调用函数早已超出范围之后也能保留正确的状态。”
来源: http: //net.tutsplus.com/tutorials/javascript-ajax/this-time-youll-learn-node-js/
参考您的多线程标签,Node.js 和 Javascript不是多线程的,它们使用闭包系统在等待回调时保留状态。因此,它们不是完全非阻塞的。有很多情况会发生阻塞,但对于大多数小型实现,开发人员永远不会遇到阻塞情况。
有关 node.js 为何不好的可能信息,请参见此处:http: //teddziuba.com/2011/10/node-js-is-cancer.html(链接已损坏)
在这里反驳: http: //rhyolight.posterous.com/nodejs-is-not-cancer (链接断开)
异步函数在 JavaScript 中通常是基于事件的,这意味着注册回调处理程序。您的代码在注册后继续运行,但不等待事件 - 必须从处理程序调用事件之后要做的所有事情。我希望这说明了一切。
当然也有例外,比如浏览器中的window.alert
// 。confirm
prompt
https://youtu.be/dFnkZ15-_0o?t=2125 This excerpt from Andrew Mead's node.js course does a great job of visually explaining the differences between non-blocking and blocking I/O operations in JS. The clip is from 35:25 - 47:16.