node.js如何实现非阻塞I/O?

7

我从这里了解到,node.js实现了非阻塞I/O模型。但我不明白是如何做到的。

由于JavaScript是单线程的,一个线程如何能够进行I/O操作并同时执行进一步的处理。

3个回答

10

虽然像sleep这样的操作会阻塞线程,但I/O事件确实可以是异步的。

Node.js使用事件循环来实现。事件循环是“一个处理和处理外部事件并将其转换为回调调用的实体”。

每当需要数据时,Node.js会注册一个回调函数并将操作发送到该事件循环。当数据可用时,就会调用回调函数。

有关更多信息,请参见http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/


2
我正要发布那个链接。这是一篇很好的文章,应该能解释你需要知道的内容。 - Andy

9
node.js 处理的 I/O 在内部是多线程的。但编程接口是单线程和异步的。

0

Ryan Dahl: 2009年JSConf上的Node.js原始演示(Ryan是Node.js的创造者)

这个视频将回答你的问题。

JavaScript(v8)的本质是事件回调(例如button onclick="functions()"等)。这就是I/O多线程化的方式。我们仍然需要编写我们的代码,通过只编写回调来避免阻塞I/O;否则,代码将在等待db.query响应时被阻塞,并在执行下一行代码之前等待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接