这是我在知乎上看到的解释。这里有几点不解:
1. "等待的超时时间由计时器周期决定"(高亮处),这个“计时器周期”到底指什么?怎么确定?
2. 如果超时是不是直接退出了?(因为没有就绪事件了)
3. 这样的话如果有些耗时的事件,如网络请求,查询数据库等没有就绪,那程序也退出了,这种情况怎么处理?
4. 我记得《深入浅出 nodejs 》里面说的是每次取一个事件,这里说全部取出,到底哪个正确?
谢谢大牛解答!
1
SPACELAN Dec 19, 2015
1. 这里说的等待应该是事件循环线程等待吧,当就绪队列中没有就绪事件时,线程阻塞等待一段时间而不是马上进入下一次循环,这可以减轻 cpu 压力。但是如果等待的时间里有计时器超时,那么就会造成计时器延迟相应,所以等待时间由计时器周期决定,避免响应延迟
2. 超时后线程被唤醒,进入下一次事件循环 3. 程序没有退出 4. 我不知道,但是两者应该都可以,得从性能上考虑哪种更优 5. 以上都是瞎说的 |
2
cattail Dec 19, 2015 This is a good start point: https://github.com/nodejs/node/blob/69b94ec55cb0f8bd90475b5b7dabd57beb7e7dfe/deps/uv/src/unix/core.c#L331
|
3
fds Dec 19, 2015
事件循环就是 while (true) {有事件就回调}
文中的意思是 while (true) {有事件就回调,没事件等 1ms} 楼主用 node 的时候其实完全不用关心这个问题。 |
4
chemzqm Dec 19, 2015
node 本身受限与 javascript 执行效率,而且做的事也很多,所以搞的很复杂,你要真想学习可以尝试用 libuv 自己实现一个事件回调,这样你也不必局限与使用 javascript 。
了解 node 实现里面这些细枝末节的东西我真觉得对多数开发者而言没啥意义,除非你奔着给 node 提 issue |