• <center id="ye0c0"><u id="ye0c0"></u></center>
  • <optgroup id="ye0c0"><acronym id="ye0c0"></acronym></optgroup>
  • Node.js的事件輪詢Event Loop原理解釋

      事件輪詢主要是針對事件隊列進行輪詢,事件生產者將事件排隊放入隊列中,隊列另外一端有一個線程稱為事件消費者會不斷查詢隊列中是否有事件,如果有事件,就立即會執行,為了防止執行過程中有堵塞操作影響當前線程讀取隊列,事件消費者線程會委托一個線程池專門執行這些堵塞操作。

    事件隊列

      Javascript前端和Node.js的機制類似這個事件輪詢模型,有的人認為Node.js是單線程,也就是事件消費者是單線程不斷輪詢,如果有堵塞操作怎么辦,不是堵塞了當前單線程的執行嗎?

      其實Node.js底層也有一個線程池,線程池專門用來執行各種堵塞操作,這樣不會影響單線程這個主線程進行隊列中事件輪詢和一些任務執行,線程池操作完以后,又會作為事件生產者將操作結果放入同一個隊列中。

      總之,一個事件輪詢Event Loop需要三個組件:

    1. 事件隊列Event Queue,屬于FIFO模型,一端推入事件數據,另外一端拉出事件數據,兩端只通過這個隊列通訊,屬于一種異步的松耦合。
    2. 隊列的讀取輪詢線程,事件的消費者,Event Loop的主角。
    3. 單獨線程池Thread Pool,專門用來執行長任務,重任務,干繁重體力活的。

    node.js的eventloop事件輪詢

      在Node.js中,因為只有一個單線程不斷地輪回查詢隊列中是否有事件,對于數據庫 文件系統等I/O操作,包括HTTP請求等等這些容易堵塞等待的操作,如果也是在這個單線程中實現,肯定會堵塞影響其他工作任務的執行,Javascript/Node.js會委托給底層的線程池執行,并會告訴線程池一個回調函數,這樣單線程繼續執行其他事情,當這些堵塞操作完成后,其結果與提供的回調函數一起再放入隊列中,當單線程從隊列中不斷讀取事件,讀取到這些堵塞的操作結果后,會將這些操作結果作為回調函數的輸入參數,然后激活運行回調函數。

      請注意,Node.js的這個單線程不只是負責讀取隊列事件,還會執行運行回調函數,這是它區別于多線程模式的一個主要特點,多線程模式下,單線程只負責讀取隊列事件,不再做其他事情,會委托其他線程做其他事情,特別是多核的情況下,一個CPU核負責讀取隊列事件,一個CPU核負責執行激活的任務,這種方式最適合很耗費CPU計算的任務。反過來,Node..js的執行激活任務也就是回調函數中的任務還是在負責輪詢的單線程中執行,這就注定了它不能執行CPU繁重的任務,比如JSON轉換為其他數據格式等等,這些任務會影響事件輪詢的效率。

     

    NodeJs入門之事件驅動

    Node.js專題

    Netty原理和使用

    基于線程與基于事件的并發編程之爭

    Ratpack可快速開發異步響應式的Java Web應用

     

     

    美女漫画大全