NodeJS事件循环是如何工作的?

3

对于以下代码:

var fs = require('fs');

fs.watch('target.txt', function(event, fileName){
    console.log('Event: ' + event + ', for file: ' + fileName);
    });

Console.log('Now watching target.txt');

根据下面的架构图,
1)fs.watch()将调用libuvlibuv将启动一个线程来跟踪target.txt上的change事件。来自libuv的结果将经过v8,再通过NodeJS绑定以回调形式带有数据的缓冲区返回。
2)libuvchange事件添加到事件队列中。当事件循环选择change事件时,相应的回调在v8运行时执行。

enter image description here

我的理解正确吗?

我不理解那些点踩的人。虽然提问者对Node存在误解,但这是一个常见的误解,因此这个问题实际上将对许多刚开始使用NodeJS的人有所帮助。 - Lajos Arpad
2个回答

1
不,你误解了。NodeJS没有线程,而是单线程的,使用观察者模式。事件循环等待事件发生(观察事件)。当事件发生时,它调用其处理程序。多线程方法的错觉来自于Node经常使用异步事件,定义回调函数在给定任务完成时执行。在这里阅读更多信息。

@overexchange,“Node.js是单线程应用程序,但通过事件和回调的概念支持并发。”http://www.tutorialspoint.com/nodejs/nodejs_event_loop.htm - Lajos Arpad
1
正如你所说:“它是单线程的,而是使用观察者模式。” 你能验证一下这个实现它的代码吗?这里 - overexchange
不,这个模型不是多线程的。它会定期检查是否有任务需要执行,如果有,就会执行。没有线程,也没有其他类似的东西,只是一个无限循环的任务管理器。 - Lajos Arpad
当任务执行时,如果任务进入IO等待状态会发生什么?任务调度程序如何重新获得控制权?因为这是单线程的。 - overexchange
NodeJS有一个事件循环来实现这个目的,请阅读此文章以获取更多信息:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ - Lajos Arpad
显示剩余5条评论

1

请在您的答案中包含页面的相关部分,以便如果网站崩溃或链接中断,您的答案仍然有用。 - Zach Saucier

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