[英]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.