iT邦幫忙

3

【我可以你也可以的Node.js】第五篇 - Task queue、EventLoop

  • 分享至 

  • xImage
  •  

嗨打給賀~哇洗Robinლ(́◕◞౪◟◕‵ლ)
大家好的台語=> 打給賀
岳母好的台語=> 打給賀
我是不會消費別人的客家人(因為客家人本來就不會消費(΄ಢ◞౪◟ಢ‵))
台語超爛xDD但是覺得台語很有趣(題外話)

咳咳嗯!
直接切入正題
為了更清楚詮釋所以另闢這篇,
上集回顧 點我
其實我也是很沒把握能夠完整且沒有遺漏的記錄下來。
所以如果有大大認為有遺漏或是寫不好的地方拜託跟我說一下。
這篇我希望我可以從幹話型作者轉型成為專業的技術型作者
所以以下開始內容我都不會再講多餘的廢話。
那我們這篇就到這邊到一個段落,謝謝大家的觀看。
ヽ(́◕◞౪◟◕‵)ノ
我會盡量以我自己能信服的方式寫出讓大家都能好懂的文章。


本篇學習目標◑ω◐:

  • 任務列隊(task queue)乖乖排隊━(゚∀゚)━( ゚∀)━━(゚∀゚)━
  • 事件迴圈(EventLoop)格林機槍(゚Д゚)σ━000000━●

任務列隊(task queue)乖乖排隊━(゚∀゚)━( ゚∀)━━(゚∀゚)━

在我寫Javascript之前根本不知道有非同步這件事,
我只知道以前計算機概論老師教的,
程式一行一行執行,執行完一行才會執行下一行。
(這邊不是意味著非同步是跳著讀取的)

先來說說非同步的來由
研究了一下是因為,就單線程而言原本javascript設計者發現,
我們執行程式時,除了要應付大量的計算外,
剩餘時間其實CPU是閒著的
因為IO(輸入輸出的設備)很慢
比方說DOM鍵盤滑鼠操作或是Ajax操作網路讀取一些資料,
所以大部分都在等待(¯﹃¯)。
所以其實可以先完全不管IO設備,先繼續運行下去,
等到IO設備好了,再回過頭把它執行完成。
(看完覺得滿道理的(`・ω・´))
什麼意思?
舉現實例子來說就是你老闆看到你領著他的薪水但是你卻看起來很閒,
只因為你說:某某某還沒給我東西啊,所以我等他。
老闆(Javascript設計者)這時候就生氣了。(╬゚д゚)▄︻┻┳═一
2老闆:你是勞工!我花錢請你來%^#%@#&^#^$

老闆期望你應該這樣,才不會白花錢請你。

好比喻大概是以上。
我相信看完上述的內容,
明天的新聞頭條我大概想得到是以下

震怒!上千萬顆CPU連署抗議Javascript設計者剝奪每一顆CPU的人權

有了上述基本的概念之後應該會比較好懂

所以他會怎麼運作?以遊戲破關比對來說

  1. 所有同步任務都會在主線上面執行

    就像是遊戲都有一個主線,你必須依序完成他才能繼續破關。

  2. 除了主線之外還有一條叫做任務列隊(task queue)負責放準備完成的異步任務

    這就像是遊戲中支線任務會獨立一個列表讓你查看有哪些支線已經完成了

  3. 當主線(同步)任務解完了,就會查看任務列隊(task queue)有哪些已經處於等待結束的狀態,就會排入主線開始執行

    像是一個遊戲玩家再破主線時,趁主線解完一個章節時順便時不時打開列表看哪些支線任務已經順便解完了。

  4. 重複執行第三步

    像每次主線每個章節都這樣一直檢查支線有沒有已經解完的。

另外任務列隊除了可以放異步任務之外還可以放定時器
(像是setTimeout()和setInterval()這兩個函數)

事件迴圈(EventLoop)格林機槍(゚Д゚)σ━000000━●


看完上述任務列隊之後,
其實事件迴圈(Event loop) 就是指主線任務循環不斷的去讀取
這個動作這個機制就叫做EventLoop
(也就是上面提的第四點)

為什麼我會說格林機槍?
因為我覺得就真的很像機槍的運作方式(๑•́ ₃ •̀๑)
槍管發射就是主線,旁邊的彈鏈就像任務列隊,
裝好的就準備發射,不斷循環。(๑•̀ω•́)ノ
這樣看是不是很像!!?ヽ(́◕◞౪◟◕‵)ノ

(純粹只是覺得起來很像而已ヽ(́◕◞౪◟◕‵)ノ,如果覺得比喻很爛...先說聲抱歉)

如果喜歡看正規圖可以看這個(΄ಢ◞౪◟ಢ‵)

在主線程執行時會產生堆積(Heap)和堆疊(Stack),
這邊就不多做贅述可以看這篇

小結語:

Node 是基於javascript,也就代表他繼承了Javascript單執行緒的本質,所以他是同步的,可是在伺服器應用程式中每個函式要等待他的回傳或是其他物件,會造成伺服器很嚴重的問題,而事件迴圈是開啟非同步功能的其中一種方法。

上述說的事件回圈是指javascript的事件迴圈,

下一篇會介紹

  • NodeJs的事件迴圈
  • EventEmiiter

這篇小心得

開始思考是不是理論和幹話太多,
沒有一點Code會讓人覺得無聊...
不過我希望用一些比較有趣的例子盡量讓文章不枯燥Orz
希望我的改變你看得見(除了幹話的部分)
喜歡幫我按讚分享加訂閱


參考文獻

Banner設計
Node官方 Document
Node.js process模組解讀
process Node.js API
Program/Process/Thread 差異
JavaScript 运行机制详解:再谈Event Loop
EventLoop圖片來源
堆積
堆疊
非同步程式碼之霧:Node.js 的事件迴圈與 EventEmitter


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
W
iT邦新手 5 級 ‧ 2020-10-17 22:49:48

哈哈哈 感謝幹話讓event loop變得簡單易懂!~

我要留言

立即登入留言