1. 程式人生 > >Generetor函數與線程之間的思考

Generetor函數與線程之間的思考

核心 xxx 參考 需要 什麽是 壓入 線程 總結 標準化

在解析這個問題之前,首先,我們來了解一下es6標準裏新增解決異步的兩種規範
Promise與Generetor

Promise

其實Promise的本質 還是基於js程式的回調處理————這一點看它的源碼封裝,或者將它通過ATS(抽象語法樹)解析成es5,我們可以得出這樣的結論。
當需要一定等待時間才能執行並返回結果的事件,我們稱之為異步。
那麽Promise是怎樣處理的呢?
Promise是基於社區早已有的解決方案,在es6中將它標準化了。
我們可以從它的字面意思中得到它的處理形式 —— 承諾。

也就是說,當js線程 接受一個promise異步時,此時它會先返回一個承諾(此時這個異步扔到了異步隊列中的promise隊列)

—— 意思是你先幹其他事,這個事處理完了我會給你個結果(當從異步隊列裏拿出來扔到執行棧執行後,出來結果時)。
沒辦法啊單線程嘛。
這是典型的異步IO式解決方案。
如圖:
技術分享圖片

fuck dog,以前有圖的,找不到了,現畫了一張。主要對比下面的generetor

Genegetor

而generetor的解決方案,並非是基於js程式的回調處理。
這一點,es6規範裏提到過:
xxxxxxxx…(詳情請參考es6標準文檔)
簡單說一下核心思想:
generator是通過輪詢解決的異步。
後面說總結。
那麽什麽是輪詢呢?
上圖:
技術分享圖片

ok,從圖中你可以get 到,輪詢即周期性的訪問線程,是否已執行完該操作。

如果從js解釋器的角度來講:
就是把異步直接扔到事件隊列,排序壓入執行棧(等待時間也看作是執行時間)執行。
也就是所謂的把異步 同步序列化。

非阻塞式線程與generetor函數之間不得不說的秘密

未完待續。

Generetor函數與線程之間的思考