<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [NodeJS] timers階段的源碼解析

      timers階段是Nodejs事件循環中的一個階段,這一階段主要是檢查是否有到期的定時器,如果有則執行其回調。

      相關源碼位置:

      timers階段的代碼比較少,這里直接貼出來,你也可以點進去上面的源碼看自己感興趣的部分:

      void uv__run_timers(uv_loop_t* loop) {
        struct heap_node* heap_node;
        uv_timer_t* handle;
        struct uv__queue* queue_node;
        struct uv__queue ready_queue;
        
        // 初始化一個空的 ready_queue 隊列,用于存放已經到期的定時器
        uv__queue_init(&ready_queue);
      
        for (;;) {
          // 獲取堆中最小(即最早到期)的定時器節點
          heap_node = heap_min(timer_heap(loop));
          if (heap_node == NULL)
            break;  // 如果堆是空的(沒有定時器),則跳出循環
      
          // 將堆節點轉換為 uv_timer_t 類型的定時器句柄 handle
          handle = container_of(heap_node, uv_timer_t, node.heap);
          if (handle->timeout > loop->time)
            break;  // 如果當前定時器的超時時間大于當前的循環時間,則跳出循環
      
          // 停止到期的定時器,并將其插入到 ready_queue 隊列的尾部
          uv_timer_stop(handle);
          uv__queue_insert_tail(&ready_queue, &handle->node.queue);
        }
        
        // 處理 ready_queue 中的所有定時器
        while (!uv__queue_empty(&ready_queue)) {
          queue_node = uv__queue_head(&ready_queue);  // 取出隊列頭部的節點
          uv__queue_remove(queue_node);  // 移除該節點
          uv__queue_init(queue_node);  // 重新初始化節點
          handle = container_of(queue_node, uv_timer_t, node.queue);  // 將節點轉換為定時器句柄 handle
      
          // 重新啟動定時器,如果是重復定時器,則根據設定的間隔重新計算超時時間
          uv_timer_again(handle);
          // 調用定時器的回調函數,執行定時器到期后的操作
          handle->timer_cb(handle);
        }
      }
      

      內容比較少,這里也直接貼出來:

      int uv_timer_again(uv_timer_t* handle) {
        if (handle->timer_cb == NULL)
          return UV_EINVAL;
      
        if (handle->repeat) {
          uv_timer_stop(handle);
          uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat);
        }
      
        return 0;
      }
      

      可以看到會檢查handle->repeat,這里其實就是setTimeoutsetInterval的區別了,setInterval到這里會因為handle->repeattrue而重新開啟新的一輪計時,而setTimeout則是直接跳過、結束了。

      這里的handle->repeatuint64_t類型,其實就是timeout

      這里順便貼一下uv_timer_start的代碼,感興趣可以看看。

      源碼位置:node/deps/uv/src/timer.c at main · nodejs/node (github.com)

      int uv_timer_start(uv_timer_t* handle,
                         uv_timer_cb cb,
                         uint64_t timeout,
                         uint64_t repeat) {
        uint64_t clamped_timeout;
        
        // 如果定時器正在關閉或回調函數為 NULL,則返回錯誤代碼 UV_EINVAL
        if (uv__is_closing(handle) || cb == NULL)
          return UV_EINVAL;
        
        // 停止定時器,以確保定時器在重新啟動前沒有在運行
        uv_timer_stop(handle);
        
        // 計算定時器的超時時間 clamped_timeout
        // 它是當前事件循環時間 handle->loop->time 加上 timeout
        clamped_timeout = handle->loop->time + timeout;
        // 如果發生整數溢出,導致 clamped_timeout 小于 timeout,
        // 則將 clamped_timeout 設置為最大值 UINT64_MAX
        if (clamped_timeout < timeout)
          clamped_timeout = (uint64_t) -1;
      
        // 設置定時器的回調函數、超時時間和重復間隔
        handle->timer_cb = cb;
        handle->timeout = clamped_timeout;
        handle->repeat = repeat;
        
        // start_id 用于在定時器比較函數 timer_less_than 中作為第二索引進行比較
        // 并遞增事件循環的計時器計數器
        handle->start_id = handle->loop->timer_counter++;
      
        // 將定時器插入到事件循環的定時器堆中,并啟動定時器句柄
        heap_insert(timer_heap(handle->loop),
                    (struct heap_node*) &handle->node.heap,
                    timer_less_than);
        uv__handle_start(handle);
      
        return 0;
      }
      
      • clamped_timeouttimeout之間的關系:

        • timeout 是傳遞給 uv_timer_start 函數的參數,表示定時器的初始延遲時間,以毫秒為單位;

        • clamped_timeout 是計算后的絕對時間,表示定時器實際超時的絕對時間點(以事件循環的時間 handle->loop->time 為基準)。

      • uv_timer_starttimeoute參數 和 JS中setTimeoutdelay參數是等價的。

      posted @ 2024-07-04 20:06  feixianxing  閱讀(80)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久天天躁狠狠躁夜夜av| 欧美人与动牲交精品| 国产 亚洲 制服 无码 中文| 亚洲成人av在线系列| 娇妻玩4p被三个男人伺候| 一本大道无码av天堂| 国产精品久久久久影院色| 久久精品夜色噜噜亚洲av| 亚洲AV无码一二区三区在线播放| 日韩精品亚洲精品第一页| 久久精品色一情一乱一伦| 久久一本人碰碰人碰| 高清中文字幕一区二区| 日韩成人福利视频在线观看| 亚洲欧洲一区二区免费| 欧美熟妇xxxxx欧美老妇不卡| 国产成人不卡一区二区| 亚洲熟妇自偷自拍另欧美| 亚洲午夜久久久影院伊人| 亚洲成人av在线综合| 精品福利视频一区二区三区| 亚洲乱码一区二区三区视色| 日本一区不卡高清更新二区| 国产一区二区不卡91| 男人和女人高潮做爰视频| 狠狠色噜噜狠狠狠狠777米奇| 亚洲人成色777777老人头| 精品人妻伦一二三区久久| 四虎永久免费高清视频| 亚洲精品日韩中文字幕| 任我爽精品视频在线播放| 国产高在线精品亚洲三区| 欧美国产日韩久久mv| 国产精品一码在线播放| 阜城县| 免费人成再在线观看视频| 视频一区二区 国产视频| 无套内谢少妇一二三四| 日本精品一区二区不卡| 不卡一区二区三区在线视频| 国产不卡一区不卡二区|