跳到主要内容
CNode

Nodejs 中event loop是事件驱动 还是轮询的

问答
Ddai1054067910发布于 9 年前最后回复 9 年前
1455220

nodejs 去检查timers, poll等的event loop是怎么触发的,如果是轮询,时间间隔多少

查看回复

回复 (14)

Y
Yuki-Minakami#149 年前
引用 JacksonTian就是轮询事件。

@JacksonTian 请问轮询是指while(true)不断查询事件队列的意思吗

J
JacksonTian#139 年前

就是轮询事件。

H
htoooth#129 年前

当然不是

Y
Yuki-Minakami#119 年前

@i5ting 哈哈,我只看了libuv项目下面的一些文件,node.cc确实没看过 有时间好好研究下

I
i5ting#109 年前
引用 Yuki-Minakami@i5ting 这段代码是哪个文件下的?找半天没找到

@Yuki-Minakami node.cc最核心的文件啊,看来你还没看明白主流程啊

Y
Yuki-Minakami#99 年前

@i5ting 这段代码是哪个文件下的?找半天没找到

I
i5ting#89 年前
引用 Yuki-Minakami是的,核心代码在libuv/src/unix/core.c 的uv run方法里,你可以参考下

@Yuki-Minakami 那个太靠后了

{
    SealHandleScope seal(isolate);
    bool more;
    do {
      v8_platform.PumpMessageLoop(isolate);
      more = uv_run(env.event_loop(), UV_RUN_ONCE);

      if (more == false) {
        v8_platform.PumpMessageLoop(isolate);
        EmitBeforeExit(&env);

        // Emit `beforeExit` if the loop became alive either after emitting
        // event, or after running some callbacks.
        more = uv_loop_alive(env.event_loop());
        if (uv_run(env.event_loop(), UV_RUN_NOWAIT) != 0)
          more = true;
      }
    } while (more == true);
  }
D
dai1054067910#69 年前

谢谢两位啊

Y
Yuki-Minakami#59 年前

是的,核心代码在libuv/src/unix/core.c 的uv_run方法里,你可以参考下

D
dai1054067910#39 年前

类似于一个while true的循环,不断执行timers, I/o callback, poll等阶段吧

Y
Yuki-Minakami#19 年前
  • event loop是基于事件驱动的,检查到了事件就去执行,本身就是个死循环,和轮询没有太大关系
  • 执行完某个阶段的回调后自动跳到下一个阶段,这里没有轮询
  • poll阶段使用epoll_wait()来查询是否有新的event,它已经不能称之为轮询了,因为只有timeout属性,没有多次查询,这个超时时间和poll阶段本身的阻塞时间是有关联的
int epoll_wait(uv__os390_epoll* ep, struct epoll_event *events, int maxevents, int timeout);

参与回复

登录后即可参与回复。登录