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

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

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

      詳解 setTimeout、setImmediate、process.nextTick 的區別

      node.js 中的非 IO 的異步 API 提供了四種方法,分別為 setTimeOut(), setInterval(), setImmediate() 以及 process.nextTick(),四種方法實現原理相似,但達到的效果略有區別:

      1、事件循環 Event Loop

      首先,我們需要了解node.js的基于事件循環的事件模型,正是因為它才使得node.js中回調函數十分普遍,也正是基于此,node.js實現了單線程高效的異步IO(這里說的單線程主要說的是執行javascript代碼部分的線程,而異步IO部分node.js其實還是利用線程池去執行的)。

      簡單的講就是,在node.js啟動時,創建了一個類似while(true)的循環體,每次執行一次循環體稱為一次tick,每個tick的過程就是查看是否有事件等待處理,如果有,則取出事件極其相關的回調函數并執行,然后執行下一次tick。所以,有如下代碼:

      A();
      B();
      C();

      它的執行邏輯是,先詢問事件觀察者當前是否有任務需要執行?觀察者回答“有”,于是取出A執行,A是否有回調函數?如果有(如果沒有則繼續詢問當前是否有任務需要執行),則取出回調函數并執行(注意:回調函數的執行基本都是異步的,可能不止一個回調),執行完回調后通過某種方式通知調用者,我執行完了,并把執行結果給你,你自己酌情處理吧,主函數不需要不斷詢問回調函數執行結果,回調函數會以通知的方式告知調用者我執行完了(don’t call me ,i will call you.),而這個過程主線程并不需要等待回調函數執行完成,它會繼續向前執行,即再次詢問觀察者當前是否還有任務需要執行,重復上面的步驟。。。直到觀察者回答沒有了,線程結束。

      整個事件循環的邏輯如下圖:

      這里寫圖片描述

      2、setTimeOut(), setInterval(), setImmediate() 以及 process.nextTik()

      這里面setTimeOut()與setInterval()除了執行頻次外基本相同,都表示主線程執行完一定時間后立即執行,而setImmediate()與之十分相似,也表示主線程執行完成后立即執行。那么他們之間的區別是什么呢?

      代碼如下:

      setTimeout(function(){
          console.log("setTimeout");
      },0);
      
      setImmediate(function(){
          console.log("setImmediate");
      });

      兩者都代表主線程完成后立即執行,其執行結果是不確定的,可能是setTimeout回調函數執行結果在前,也可能是setImmediate回調函數執行結果在前,但setTimeout回調函數執行結果在前的概率更大些,這是因為他們采用的觀察者不同,setTimeout采用的是類似IO觀察者,setImmediate采用的是check觀察者,而process.nextTick()采用的是idle觀察者。

      三種觀察者的優先級順序是:idle觀察者>>io觀察者>check觀察者

      process.nextTick()與setImmediate()和setTimeout()的區別如下:

      【1】原始代碼:

      A();
      B();
      C();

      它的執行順序即代碼順序:

      這里寫圖片描述

      【2】process.nextTick() 執行效果,代碼如下:

      A();
      process.nextTick(B);
      C();

      它的執行順序如下:

      這里寫圖片描述

      【3】setImmediate() 或者 setTimeout()執行效果,代碼如下:

      A();
      setImmediate(B);//或者setTimeout(B,0);
      C();

      它的執行順序如下:

      這里寫圖片描述

      結論: 

      • process.nextTick(),效率最高,消費資源小,但會阻塞CPU的后續調用; 
      • setTimeout(),精確度不高,可能有延遲執行的情況發生,且因為動用了紅黑樹,所以消耗資源大; 
      • setImmediate(),消耗的資源小,也不會造成阻塞,但效率也是最低的。

       

      setTimeout(() => console.log(1), 100);
      setTimeout(() => {
        for (let i=0; i<10000000; i++) {
           ;
        }
        console.log(2); 
      
      }, 99.99)
      

        

       

      setTimeout(() => console.log(1), 100);
      process.nextTick(() => console.log(2));
      setImmediate(() => console.log(3));
      setTimeout(() => {
        for (let i=0; i<10000000; i++) {
           ;
        }
        console.log(4); 
      
      }, 99.99)
      

        

       

       

       

      原文鏈接:http://blog.csdn.net/hkh_1012/article/details/53453138

      posted @ 2017-09-28 10:24  一像素  閱讀(10571)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产综合视频一区二区三区| 久久精品丝袜高跟鞋| 狠狠综合久久综合88亚洲爱文| 亚洲 成人 无码 在线观看| 日韩精品区一区二区三vr| 性姿势真人免费视频放| 视频二区中文字幕在线| 久青草精品视频在线观看| 国产亚洲综合另类色专区| 亚洲综合无码AV在线观看| 四虎永久精品免费视频| 亚洲国产精品无码一区二区三区| 高清美女视频一区二区三区| 国产av一区二区三区久久| 久久精品国产99久久6| 亚洲第一福利网站在线观看| 日韩精品福利视频在线观看| 日本夜爽爽一区二区三区| 蜜桃一区二区三区免费看| 国产中文字幕精品免费| 又黄又爽又色的少妇毛片| 国产成人免费永久在线平台| 少妇熟女久久综合网色欲| 云安县| 久久亚洲中文无码咪咪爱| 99精品热在线在线观看视| 阜康市| 久久综合伊人77777| 国产精品久久久久久久9999| 亚洲精品国产自在现线最新| 中文字幕无码免费久久| 亚洲精品日韩精品久久| 日韩永久永久永久黄色大片| 免费无码又爽又刺激高潮虎虎视频| 性色av极品无码专区亚洲| 中文字幕久久六月色综合| 国产AV巨作丝袜秘书| 精品伊人久久久香线蕉| av新版天堂在线观看| 亚洲天堂男人的天堂在线| 免费无码又爽又刺激网站|