首先我来描述一下我对于Node.js 基于事件驱动的 异步 I/O 的理解:Node是单线程的,所以代码执行是重上到下的一种线性执行规律,但是碰到异步代码的时候, Node把异步执行的代码放到一个执行栈中(事件队列),并且让该代码块在执行栈里面执行完以后告诉Node"我执行完了",在这之后就会执行该异步代码对应的回调函数。在node把这个异步的代码丢到执行栈的同事,它并不会阻塞,而是继续执行下面的代码。那么我的问题来了,因为js本身就是单线程的,node亦是如此。就像上面所描述的那样,node不会阻塞,那么到底是谁来执行“执行栈”中的代码的呢?
对于我的理解如果有错的地方还请大家纠正
@alsotang 书上都说Node是单进程单线程的, 但是对于 事件驱动的异步I/O这一块的讲解 都很模糊(反正我是没很懂),有的地方说是因为v8引擎 执行的速度很快才造成了这一种假象。但是我还是想听听更全面的讲解, 在知乎上我也提了这个问题也@你了
@alsotang 这篇日志是 阮一峰的,我看过了的,他提到的4个步骤
(1)所有任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。系统把异步任务放到"任务队列"之中,然后继续执行后续的任务。
(3)一旦"执行栈"中的所有任务执行完毕,系统就会读取"任务队列"。如果这个时候,异步任务已经结束了等待状态,就会从"任务队列"进入执行栈,恢复执行。
(4)主线程不断重复上面的第三步。
我有几个问题 1:主线程上的 执行栈上的所有任务执行完毕,指的是所有 非异步任务? 2:异步任务已经结束等待状态。这里是用什么标准来判断的?是之前说的 执行栈中的任务执行完了 那么就开始执行异步任务了?还是说有其他的 标志? 3:把 执行栈 中任务放到主线程中执行,那么实际上它还是 有一个等待的过程,知识说这个等待的时间很短?
@wuliao49 我是个菜鸟,我手上有3本纸质书《了不起的Nodejs》《Nodejs高级编程》和《Nodejs实战》 电子书有nodejs开发指南.pdf 深入浅出nodejs.pdf和nodejs中文指南.pdf 除了这些还有一些网络上的 文档,我对于Node的理解就是来至于这几本书, 这些书里面对于node的讲解都说是单线程,就像我说的,我是菜鸟,没办法自己去证明node 到底是不是单线程的,所以如果你有这方面的资料的话请给 我一个连接