Creeper
Creeper
@zColdWater 你理解得应该没什么问题,就是表述有点不是很好懂(比如没有event loop为空的说法)。 下面总结几点关于event loop的: 1. 在浏览器和Node.js中,JS都是以单线程在运行,当前执行栈必然是执行完(为空) 才会进入下个event loop。 2. `process.nextTick`和`Promise`都是microtask,即在进入下个event loop前执行(也可以理解成不是event loop相关的概念)。 3. `setTimeout/setImmediate/io`是task,会把回调延迟到后面的某个event loop执行。 4. node.js中event loop分为不同的阶段,每个阶段有自己的任务。
@chn777 你是指web worker吗?web worker工作在单独的线程,有自己的event loop。
@Julyrainy 简单说,`setImmediate` 只有在 `check` 阶段执行,`nextTick` 在每个阶段的末尾都会执行。即,`nextTick` 属于 microtask,而`setImmediate`属于macrotask,希望这可以帮助你理解。 可以联系 #21 一起看。
@Julyrainy > Schedules the "immediate" execution of the callback after I/O events' callbacks. Returns an Immediate for use with clearImmediate(). > When multiple calls to setImmediate() are made, the callback...
一个帮助理解的例子: ```js const async_hooks = require('async_hooks') const fs = require('fs') let indent = 0 async_hooks.createHook({ init(asyncId, type, triggerId) { const cId = async_hooks.currentId() print(`${getIndent(indent)}${type}(${asyncId}): trigger: ${triggerId} scope: ${cId}`) }, before(asyncId)...
@mygaochunming 是。但不是每个“阶段”执行一次,而是在该阶段持续执行 nextTick 注册的回调。
@mygaochunming 你贴的代码的确是死循环,`compute` 会重复执行。
@rueian 👍 提供的这段 log 对了解 libuv 的处理流程很有帮助!
@LeonAppDev Q1: JS是单线程的,对浏览器和Node.js都成立。这里的单线程的确切意思是JS的执行只在单一线程上,但Node.js 和 浏览器本身都是多线程甚至多进程的。 Q2: 我看了下的最新文档似乎有更新,我从头再看一遍来给一个确切的回答。 关于Q2,最新的文档似乎跟我原来看的略有不同,根据最新的文档,有些措辞需要更新,我会更新上面的相关部分,并在这里重点讲一下 **pending(I/O) callbacks phase vs poll phase** : - pending callbacks:executes I/O callbacks deferred to the next loop iteration。执行被推迟到下一个iteration的 I/O 回调。 - poll:获取新的I/O事件;node会在适当条件下阻塞在这里。进入poll阶段,如果poll...
@LeonAppDev 更准确的说,`pending callbacks`阶段执行的是一些被有意延迟的回调。 详情可以参考Node.js[更新相应文档](https://github.com/nodejs/nodejs.org/pull/1603)的原因: > Only some callbacks that were deliberately delayed will be executed in this phase (hence "pending"). 下面讲一讲`ECONNREFUSED`的回调(处理错误)被延迟到pending callbaks的*可能*原因。 ```c int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct...