关于 Node.js 的事件循环有几点不解

2015-12-19 10:25:50 +08:00
 josephok


这是我在知乎上看到的解释。这里有几点不解:

1. "等待的超时时间由计时器周期决定"(高亮处),这个“计时器周期”到底指什么?怎么确定?
2. 如果超时是不是直接退出了?(因为没有就绪事件了)
3. 这样的话如果有些耗时的事件,如网络请求,查询数据库等没有就绪,那程序也退出了,这种情况怎么处理?
4. 我记得《深入浅出 nodejs 》里面说的是每次取一个事件,这里说全部取出,到底哪个正确?

谢谢大牛解答!
3096 次点击
所在节点    Node.js
5 条回复
SPACELAN
2015-12-19 12:53:46 +08:00
1. 这里说的等待应该是事件循环线程等待吧,当就绪队列中没有就绪事件时,线程阻塞等待一段时间而不是马上进入下一次循环,这可以减轻 cpu 压力。但是如果等待的时间里有计时器超时,那么就会造成计时器延迟相应,所以等待时间由计时器周期决定,避免响应延迟

2. 超时后线程被唤醒,进入下一次事件循环

3. 程序没有退出

4. 我不知道,但是两者应该都可以,得从性能上考虑哪种更优

5. 以上都是瞎说的
cattail
2015-12-19 13:24:43 +08:00
fds
2015-12-19 14:22:22 +08:00
事件循环就是 while (true) {有事件就回调}
文中的意思是 while (true) {有事件就回调,没事件等 1ms}
楼主用 node 的时候其实完全不用关心这个问题。
chemzqm
2015-12-19 14:33:58 +08:00
node 本身受限与 javascript 执行效率,而且做的事也很多,所以搞的很复杂,你要真想学习可以尝试用 libuv 自己实现一个事件回调,这样你也不必局限与使用 javascript 。
了解 node 实现里面这些细枝末节的东西我真觉得对多数开发者而言没啥意义,除非你奔着给 node 提 issue
zonghua
2015-12-19 21:58:27 +08:00
@chemzqm 之前看到一个 C# libuv 的实现,对比 node 的基准评测。忘记保存输钱了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/244614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX