非阻塞IO如何在javascript中工作

rog*_*oom 2 javascript nonblocking

我读到javascript语言具有帮助实现非阻塞IO的特性,这有助于node.js等项目的成功.我的问题是这些特性是什么?为什么在其他语言中实现非阻塞IO更难?

jer*_*son 6

JavaScript本身不提供非阻塞IO.底层系统调用node.js使用非阻塞IO.JavaScript的第一类函数意味着在IO完成时很容易传递回调.

其他语言可以做非阻塞IO就好了.node.js只是认为回调使得它非常容易推理和处理非阻塞操作.

Ruby有EventMachine,它传递块而不是函数.C可以使用函数指针执行非阻塞IO,但是你不会得到闭包,所以这有点痛苦.


Jla*_*nge 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 不是多线程的,它们使用闭包系统来保存状态,同时等待回调.因此,它们并非完全无阻塞.有很多场景可以发生阻塞,但对于大多数小型实现,开发人员永远不会遇到阻塞情况.

请看这里有关为什么node.js不好的可能信息:http://teddziuba.com/2011/10/node-js-is-cancer.html(链接坏了)

这里是一个反驳:http: //rhyolight.posterous.com/nodejs-is-not-cancer (Link broken)