2017-08-08 47 views
28

我讀過thisthis,看着this ...Node.js的事件循環理解(有圖)

我做的我是如何理解的圖示:

enter image description here

  • Javascript回調(函數)可以存在於current queue,check queue,close callbacks queue,timers queueI/O callbacks queue中。
  • Js代碼一次只能從current queue一個函數(任務/作業)執行。
  • 此時執行的Js代碼可以將微任務(作業)添加到current queue以在其自身和宏任務(任務)之後執行到check queue。它只能通過要求API來完成,才能將任務添加到其他隊列中。
  • Idle, prepare階段用於某些內部節點js業務(也許像垃圾回收)。
  • Poll階段輪詢線程池中的線程並使用適當的回調來填充隊列。
  • Idle, preparepoll階段沒有與它們關聯的js回調隊列。
  • (四)thread pool中的主題都是完全相同的,沒有專業化。
  • 事件循環從每個隊列中逐個取出並執行任務,直到它爲空,然後移至下一個隊列。
  • 隊列中的任務沒有任何與其關聯的作業(微服務)。作業僅在執行任務或其他作業期間創建,並且僅存在於current task queue中。

這是理解權還是我錯過了什麼?

MS Power Point .pptx文件中的圖可以找到here

+0

這看起來過於複雜的我。也許是這樣,但是在編寫代碼時不是一個簡單的模型嗎?我認爲沒有必要了解所有細節。僅僅知道當前滴答的隊列,下一個滴答的隊列和等待定時器或I/O的回調是不夠的。 –

+8

我不能回答這個問題,但我真的很感謝你把你的問題的努力。 – georg

+0

@LorenzMeyer一個簡單的模型就足以寫代碼,但我仍想知道的引擎蓋下是什麼。喬治,謝謝:) – grabantot

回答

1

該圖看起來相當複雜。在這種情況下,我發現一個國王比喻非常完美,對事件循環的工作原理有一個灰色層次的理解。

想象一下,你想運行的代碼是一個國王,節點是僕人的軍隊 僕人。

這一天,一個僕人醒來,問他國王是否需要任何東西 。國王給僕人一份任務清單,並讓 重新睡一會兒。僕人現在在他的同事中分發這些任務 ,他們開始工作。

一旦僕人完成一項任務,他排隊在國王隊區外 報到。國王一次允許一名僕人,並傾聽他報告的事情。有時國王會在出路時給僕人更多的任務 。

生活是美好的,因爲國王的僕人在 並行執行他的所有任務,但一次只報告一個結果,所以國王可以 重點。

這裏的國王是主要的節點處理。這就是nodejs被稱爲單線程但異步的方式。