Skip to content

Commit 69e012d

Browse files
committed
新增eventloop的v8代码
1 parent 581b1da commit 69e012d

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

docs/一次搞懂EventLoop.md

+42
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,48 @@ event loop顾名思义就是事件循环,为什么要有事件循环呢?因
9999

100100
7. close callbacks
101101
关闭I/O的动作,比如文件描述符的关闭,链接断开,等等等
102+
```c++
103+
// v8中的源码部分
104+
int uv_run(uv_loop_t* loop, uv_run_mode mode) {
105+
int timeout;
106+
int r;
107+
int ran_pending;
108+
109+
r = uv__loop_alive(loop);
110+
if (!r)
111+
uv__update_time(loop);
112+
113+
//这里就是那个被称作event loop的while loop
114+
while (r != 0 && loop->stop_flag == 0) {
115+
uv__update_time(loop);
116+
uv__run_timers(loop);
117+
ran_pending = uv__run_pending(loop);
118+
uv__run_idle(loop);
119+
uv__run_prepare(loop);
120+
121+
timeout = 0;
122+
if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT)
123+
timeout = uv_backend_timeout(loop);
124+
125+
uv__io_poll(loop, timeout);
126+
uv__run_check(loop);
127+
uv__run_closing_handles(loop);
128+
129+
if (mode == UV_RUN_ONCE) {
130+
uv__update_time(loop);
131+
uv__run_timers(loop);
132+
}
133+
134+
r = uv__loop_alive(loop);
135+
if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT)
136+
break;
137+
}
138+
if (loop->stop_flag != 0)
139+
loop->stop_flag = 0;
140+
141+
return r;
142+
}
143+
```
102144
103145
除了Task还有一个microtask,这一个概念是ES6提出Promise以后出现的。这个microtask queue只有一个。并且会在且一定会在每一个Task后执行,且执行是按顺序的。加入到microtask 的事件类型有Promise.resolve().then(), process.nextTick() 值得注意的是,event loop一定会在执行完micrtask以后才会寻找新的 可执行的Task队列。而microtask事件内部又可以产生新的microtask事件比如
104146
```javascript

0 commit comments

Comments
 (0)