V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
josephok
V2EX  ›  Node.js

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

  •  
  •   josephok · 2015-12-19 10:25:50 +08:00 · 3144 次点击
    这是一个创建于 3292 天前的主题,其中的信息可能已经有所发展或是发生改变。


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

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

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

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

    3. 程序没有退出

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

    5. 以上都是瞎说的
    cattail
        2
    cattail  
       2015-12-19 13:24:43 +08:00   ❤️ 1
    fds
        3
    fds  
       2015-12-19 14:22:22 +08:00
    事件循环就是 while (true) {有事件就回调}
    文中的意思是 while (true) {有事件就回调,没事件等 1ms}
    楼主用 node 的时候其实完全不用关心这个问题。
    chemzqm
        4
    chemzqm  
       2015-12-19 14:33:58 +08:00
    node 本身受限与 javascript 执行效率,而且做的事也很多,所以搞的很复杂,你要真想学习可以尝试用 libuv 自己实现一个事件回调,这样你也不必局限与使用 javascript 。
    了解 node 实现里面这些细枝末节的东西我真觉得对多数开发者而言没啥意义,除非你奔着给 node 提 issue
    zonghua
        5
    zonghua  
       2015-12-19 21:58:27 +08:00 via iPhone
    @chemzqm 之前看到一个 C# libuv 的实现,对比 node 的基准评测。忘记保存输钱了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.