簡體   English   中英

nodejs 事件循環如何在沒有 for/while 永遠循環的情況下繼續運行?

[英]How does nodejs event loop keep running without a for/while forever loop?

我閱讀了Nodejs 事件循環“事件循環解釋”並且不要阻塞事件循環

我認為 nodejs 代碼(js 或 c++)中沒有 for/while 永遠循環,例如這里解釋了 libev 事件循環http://pod.tst.eu/http://cvs.schmorp.de/libev /ev.pod#EXAMPLE_PROGRAM

int
   main (void)
   {
     // use the default event loop unless you have special needs
     struct ev_loop *loop = EV_DEFAULT;

    // init

    // now wait for events to arrive
    ev_run (loop, 0);

    // break was called, so exit
    return 0;
 }

那么 nodejs 事件循環如何永遠運行,或者確實存在 for/while 永遠循環,如https://en.wikipedia.org/wiki/Event_loop偽代碼所示?

我搜索了所有 SO 站點,發現事件循環是否只是具有優化輪詢的 for/while 循環? . 那里有不同的意見,例如 Bryan Oakley 的回答是肯定的,而其他人的回答是否定的。

但我的問題與那個有點不同。 我想知道沒有 for/while 循環,nodejs 事件循環如何繼續運行?

為什么要使用“while true”循環? 盡管通常說“這是一個無限循環”,但這並不意味着它實際上是一個while循環。

正如您在“事件循環解釋”中讀到的那樣,事件循環周期有不同的階段。 完成最后一個階段后,它基本上會自己休眠一小段時間,然后再次從第一階段開始。 眾所周知,在瀏覽器中,使用setTimeout(callback, 0)實際上在4 or more毫秒4 or more毫秒內執行,這意味着至少 4ms 的周期之間存在差距。

我認為你在這里最大的誤解是過於字面理解這些詞。 Bryan 說“從概念的角度來看,所有事件循環本質上都是”,這並不意味着那里有實際的 while 循環。 它更復雜,並使用操作系統內部調度(內核)來等待一段時間。 我想說一個更好的例子(離實際實現還差太遠)是:

startEventLoopPhaseExecution() {
  processEventLoopPhases();
  restABit(); // synchronously do nothing for some time
  startEventLoopPhaseExecution(); // start from phase 1 again
}

有了Andrey的輸入和這篇文章Event loop in JavaScript,我進一步查看了libuv的源碼,​​確實是一個while循環,

https://github.com/libuv/libuv/blob/v1.x/src/unix/core.c#L369

int uv_run(uv_loop_t* loop, uv_run_mode mode) {
 ...
  r = uv__loop_alive(loop);
  if (!r)
    uv__update_time(loop);

  while (r != 0 && loop->stop_flag == 0) {

https://github.com/libuv/libuv/blob/v1.x/src/win/core.c#L596基本相同

int uv_run(uv_loop_t *loop, uv_run_mode mode) {
   ...
   while (r != 0 && loop->stop_flag == 0) {

起初我很困惑 nodejs 是使用 libev 還是 libuv 中實現的事件循環,但這是另一個話題。

我檢查了 ev_run 的 libev 源代碼https://github.com/enki/libev/blob/master/ev.c#L3547

這也是一個do while循環,所以我想我只是問了一個愚蠢的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM