我读到javascript语言具有帮助实现非阻塞IO的特性,这有助于node.js等项目的成功。我的问题是这些特性是什么?为什么在其他语言中实现非阻塞IO更难?
答案 0 :(得分:6)
JavaScript本身不提供非阻塞IO。底层系统调用node.js使用非阻塞IO。 JavaScript的第一类函数意味着在IO完成时很容易传递回调。
其他语言可以做非阻塞IO就好了。 node.js只是认为回调可以非常容易地推理和处理非阻塞操作。
Ruby有EventMachine,它传递块而不是函数。 C可以使用函数指针执行非阻塞IO,但是你不会得到闭包,所以这有点痛苦。
答案 1 :(得分:5)
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是 NOT 多线程,它们使用闭包系统在等待回调时保留状态。因此,它们 NOT 完全无阻塞。有很多场景可以发生阻塞,但对于大多数小型实现,开发人员永远不会遇到阻塞情况。
请点击此处查看有关为什么node.js不好的可能信息:http://teddziuba.com/2011/10/node-js-is-cancer.html(链接损坏)
这里是一个反驳:http://rhyolight.posterous.com/nodejs-is-not-cancer(链接破碎)
答案 2 :(得分:1)
异步函数通常在JavaScript中基于事件,这意味着注册回调处理程序。您的代码在注册后运行,但不等待事件 - 必须从处理程序调用事件后完成所有操作。我希望这一切都说明了。
当然有一些例外情况,例如浏览器中的window.alert
/ confirm
/ prompt
。
答案 3 :(得分:0)
https://youtu.be/dFnkZ15-_0o?t=2125摘自安德鲁·米德(Andrew Mead)的node.js课程,它在视觉上解释了JS中非阻塞和阻塞I / O操作之间的区别方面做得很好。剪辑是从35:25-47:16。