是渲染进程中的计时器触发线程? 如果同时有大量的 setTimeout,是如何处理的? 比如 for(let i = 0; i < 10000; i++) { setTimeout(() => {}, 1000) }
1
togou 2021-03-02 12:26:45 +08:00
先推到队列 然后跑别的任务 然后再检查
|
2
Chenamy2017 2021-03-02 12:56:21 +08:00
先循环推入队列
|
3
zivyou 2021-03-02 13:28:11 +08:00
------------------------------------ event loop one tick
1. ------> process.nextTick(); 2. ------> Timer // setTimeout, setInterval 3. ------> idle, prepare // node.js 内部使用 4. ------> poll // select,epoll 等系统调用的检查 5. ------> check // setImmediate 6. ------> close.callback // 一些资源的关闭调用回调 这个过程是事件循环的一个 tick. node.js 是一个类似于一个时钟周期一个时钟周期去执行的,在每个时钟周期内去做上述步骤中的工作内容。 如果有很多个 setTimeout,那在上面的第 2 步那里,会将要执行的任务都放到一个队列中。每个 tick 来的时候,看一下这些任务到没到要执行的点,如果到了,就执行一下。 |
4
pkookp8 2021-03-02 13:28:27 +08:00 via Android
|
5
yyfearth 2021-03-02 13:46:03 +08:00
@jadeborner node 和 chrome browser js 一样的 v8 引擎啊
|
6
yyfearth 2021-03-02 13:46:43 +08:00
API 不一样 但是原理是一样的
|
7
otakustay 2021-03-02 13:57:25 +08:00
timeout 的任务一直在队列中,没有“延迟推入”的说法。这个任务上有一个标识( XX 时候开始,1000ms 后要执行),JS 引擎有空的时候就会翻到这个任务,看看时间到了没有,时间没到就把它再丢回队列里去排着
|
8
cxe2v 2021-03-02 14:04:33 +08:00
浏览器关于 JS 这块一共有 5 个线程,
GUI JS 引擎 定时器 事件触发 异步请求 setTimeout 和 setInterval 是属于定时器线程将对应的任务推入任务队列 |