Node基础知识有一个不解的地方
发布于 10 年前 作者 hc2014 5804 次浏览 最后一次编辑是 8 年前 来自 问答

首先我来描述一下我对于Node.js 基于事件驱动的 异步 I/O 的理解:Node是单线程的,所以代码执行是重上到下的一种线性执行规律,但是碰到异步代码的时候, Node把异步执行的代码放到一个执行栈中(事件队列),并且让该代码块在执行栈里面执行完以后告诉Node"我执行完了",在这之后就会执行该异步代码对应的回调函数。在node把这个异步的代码丢到执行栈的同事,它并不会阻塞,而是继续执行下面的代码。那么我的问题来了,因为js本身就是单线程的,node亦是如此。就像上面所描述的那样,node不会阻塞,那么到底是谁来执行“执行栈”中的代码的呢?

对于我的理解如果有错的地方还请大家纠正

29 回复

Node不是单线程的,里面跑的JS是单线程的

@wuliao49 Node是单线程这点毋庸置疑

有一些用户无法操作的线程(我也不确定该不该称那些为线程)在负责那些 IO。

@alsotang 书上都说Node是单进程单线程的, 但是对于 事件驱动的异步I/O这一块的讲解 都很模糊(反正我是没很懂),有的地方说是因为v8引擎 执行的速度很快才造成了这一种假象。但是我还是想听听更全面的讲解, 在知乎上我也提了这个问题也@你了

@alsotang 翻了一下午的书了…答案都是那几句熟悉的话,都太模糊了

@alsotang 这篇日志是 阮一峰的,我看过了的,他提到的4个步骤

(1)所有任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。系统把异步任务放到"任务队列"之中,然后继续执行后续的任务。

(3)一旦"执行栈"中的所有任务执行完毕,系统就会读取"任务队列"。如果这个时候,异步任务已经结束了等待状态,就会从"任务队列"进入执行栈,恢复执行。

(4)主线程不断重复上面的第三步。

我有几个问题 1:主线程上的 执行栈上的所有任务执行完毕,指的是所有 非异步任务? 2:异步任务已经结束等待状态。这里是用什么标准来判断的?是之前说的 执行栈中的任务执行完了 那么就开始执行异步任务了?还是说有其他的 标志? 3:把 执行栈 中任务放到主线程中执行,那么实际上它还是 有一个等待的过程,知识说这个等待的时间很短?

@hc2014 你哪里来的毋庸置疑?不要死读书钻牛角尖 NODE本身底层访问IO等就是多线程的,自己多查资料

@wuliao49 我是个菜鸟,我手上有3本纸质书《了不起的Nodejs》《Nodejs高级编程》和《Nodejs实战》 电子书有nodejs开发指南.pdf 深入浅出nodejs.pdf和nodejs中文指南.pdf 除了这些还有一些网络上的 文档,我对于Node的理解就是来至于这几本书, 这些书里面对于node的讲解都说是单线程,就像我说的,我是菜鸟,没办法自己去证明node 到底是不是单线程的,所以如果你有这方面的资料的话请给 我一个连接

@alsotang 哦不好意思,原来这一篇是朴灵对阮一峰错误观点的批判,我先看看这篇日志o(╯□╰)o

所以让你不要死读书钻牛角尖。书上说的单线程是指 node里面javascript的执行是单线程的。 node宿主本身,它要去取IO,去调度,去检测事件队列等,它是多线程的。 就像浏览器里面执行JS一样的,浏览器本身也是多线程的,可以多线程执行webworker等。 一般不需要讲的这么复杂,所以一般就简单讲讲node是单进程单线程也没错。 理解而不是抠字眼

@wuliao49 有文档连接或者书籍的名称吗?或者有执行代码是最好的

@alsotang 朴灵这篇文章中,提到了**“磁盘IO操作的时候会用到线程池”**,妈蛋,如此说来node 还真是多线程的了?

反复说了node里面javascript的执行是单线程的,所以你要执行代码有什么用? node.jpg 我随便跑了一个node应用,你自己看上面有几个线程?

@wuliao49 妈蛋,好像真是你说的那样,你那有没有文档连接或者书籍的名称?

@wuliao49 我擦,我去试试先 这会 o(╯□╰)o大了

赞楼主精神 ~~

这些书确实没有讲得很清楚。。

http://book.mixu.net/node/ch2.html 这一节那个服务器例子,分的[nodejs runtime] [v8 engine]

还是买本深入浅出来看吧,看完你基本就知道了。

js是单线程,这点毋庸置疑,但是node.js处理各种i/o的时候,是多线程的。说白了,用户代码是单线程,其他的是可以并行起来执行的。

请见阮一峰的 日志, 里面写的挺清楚的.

@JavaCS3 貌似阮一峰写的不咋地,看朴灵的书吧。

@JavaCS3 看过了,这篇日志很多地方都是错的.

@soliury 恩,之前看了几本书都没有提及到这一点,所以非常想不通这个问题.现在明白了

js的上下文是单线程的,但是node不是,例如文件io在很多系统上无法做到异步非阻塞,只能通过线程去解决,

阮一峰日志里提到的讲座: Help, I’m stuck in an event-loop,讲的挺清楚的: http://vimeo.com/96425312

@hc2014 都是错的? 没仔细研究过… 看样子尽信书不如无书!

回到顶部