File tree 2 files changed +18
-11
lines changed
2 files changed +18
-11
lines changed Original file line number Diff line number Diff line change 6
6
![ ] ( 5fee18eegw1ewjpoxmdf5j20k80b1win.jpg )
7
7
8
8
9
- ### 事件和事件处理器
10
- 在事件循环里,有两个主要角色:
11
-
12
- * 事件本身
13
-
14
- * 事件处理器,即这些事件的订阅者
15
-
16
- 事件,可以是十分底层的操作系统事件,如“文件已经准备好被写入”或“收到了一个新的HTTP请求”。事件处理器,则是当指定事件触发时,执行的一段代码。
17
-
18
- ###
19
- ![ ] ( http://bytearcher.com/articles/event-loop-10-000ft/event-loop.svg )
9
+ ### 事件循环
20
10
事件循环的职责,就是不断得等待事件的发生,然后将这个事件的所有处理器,以它们订阅这个事件的时间顺序,依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。
21
11
22
12
当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。
54
44
code = EmitExit(env);
55
45
RunAtExit (env);
56
46
```
47
+
57
48
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。
58
49
59
50
接下来Node会根据more的情况决定下一步操作:
@@ -71,3 +62,19 @@ more用来标识是否进行下一轮循环。 env->event_loop()会返回之前
71
62
- 文件操作和DNS操作没有(很好的)系统解决方案,因此libuv自建了线程池,在其中进行阻塞式I/O。
72
63
73
64
另外我们也可以将自定义的函数抛到线程池中运行,在运行结束后主线程会执行相应的回调函数,不过Node并没有将这一项功能加入到JavaScript中,也就是说只用原生Node是无法在JavaScript中开启新的线程进行并行执行的。
65
+
66
+ ### process.nextTick
67
+ 
68
+ 带着这个问题,我们看看 JS 层的 LOOP 是怎样的。
69
+
70
+ ### 总结
71
+
72
+
73
+ ### 参考
74
+
75
+
76
+
77
+
78
+
79
+
80
+
You can’t perform that action at this time.
0 commit comments