Skip to content

Commit bbcc7eb

Browse files
committed
chapter5-1
1 parent d9c44fc commit bbcc7eb

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

Diff for: chapter5/chapter5-1.md

+18-11
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,7 @@
66
![](5fee18eegw1ewjpoxmdf5j20k80b1win.jpg)
77

88

9-
### 事件和事件处理器
10-
在事件循环里,有两个主要角色:
11-
12-
* 事件本身
13-
14-
* 事件处理器,即这些事件的订阅者
15-
16-
事件,可以是十分底层的操作系统事件,如“文件已经准备好被写入”或“收到了一个新的HTTP请求”。事件处理器,则是当指定事件触发时,执行的一段代码。
17-
18-
###
19-
![](http://bytearcher.com/articles/event-loop-10-000ft/event-loop.svg)
9+
### 事件循环
2010
事件循环的职责,就是不断得等待事件的发生,然后将这个事件的所有处理器,以它们订阅这个事件的时间顺序,依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。
2111

2212
当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。
@@ -54,6 +44,7 @@ do {
5444
code = EmitExit(env);
5545
RunAtExit(env);
5646
```
47+
5748
more用来标识是否进行下一轮循环。 env->event_loop()会返回之前保存在env中的default_loop_ptr,uv_run函数将以指定的UV_RUN_ONCE模式启动libuv的event loop。在这种模式下,uv_run会至少处理一个事件:这意味着,如果当前事件队列中没有需要处理的I/O事件,uv_run会阻塞住,直到有I/O事件需要处理,或者下一个定时器时间到。如果当前没有I/O事件也没有定时器事件,则uv_run返回false。
5849
5950
接下来Node会根据more的情况决定下一步操作:
@@ -71,3 +62,19 @@ more用来标识是否进行下一轮循环。 env->event_loop()会返回之前
7162
- 文件操作和DNS操作没有(很好的)系统解决方案,因此libuv自建了线程池,在其中进行阻塞式I/O。
7263
7364
另外我们也可以将自定义的函数抛到线程池中运行,在运行结束后主线程会执行相应的回调函数,不过Node并没有将这一项功能加入到JavaScript中,也就是说只用原生Node是无法在JavaScript中开启新的线程进行并行执行的。
65+
66+
### process.nextTick
67+
![](settimeout.jpeg)
68+
带着这个问题,我们看看 JS 层的 LOOP 是怎样的。
69+
70+
### 总结
71+
72+
73+
### 参考
74+
75+
76+
77+
78+
79+
80+

Diff for: chapter5/settimeout.jpeg

83.1 KB
Loading

0 commit comments

Comments
 (0)