js event loop事件迴圈

2022-03-07 01:42:51 字數 1596 閱讀 4893

以下兩段**是等價的。req對事件的**設定,實際上就是當前主線程任務佇列的任務。

settimeout(fn,0):往訊息佇列尾部新增一條訊息,指定主線程有空的時候(所有同步任務執行完),要盡快執行fn函式

對於事件迴圈應該這麼理解:

主線程中有乙個(同步)任務佇列,另乙個地方又有乙個訊息佇列。

僅當任務隊列為空時,主線程才會去檢查訊息佇列,取訊息,然後把對應的**函式以乙個任務的形式插入到主線程的任務佇列中。

當任務佇列不為空時,主線程會不停地從任務佇列中取出任務,執行。直到任務隊列為空,這個過程稱為一次事件迴圈

事件迴圈實際上就是主線程【執行任務】和【取訊息、插入任務】的過程,兩部分不停迴圈

可見主線程所做的事情就是,執行任務、取訊息、插入任務。那插入訊息這個過程誰來做?

這裡引入乙個概念叫做「工作執行緒」,主線程執行任務時,可能會開啟非同步任務(如ajax,timeout等),這時實際上就是通知乙個工作執行緒去執行這個非同步任務,執行完成後,這個工作執行緒就往訊息佇列中插入乙個訊息,表示通知主線程,你交給我的任務我已經搞定啦

根據以上的理解可以發現,訊息和**函式必定是一一對應的。看看這個例子

var getmsg = new promise(function

(resolve,reject));

getmsg.then(

function

(data));

console.log('last');

執行輸出:

begin...

last

ok

對於promise,看起來像觸發**的時候,這個**還沒定義。但實際上不是這樣的,promise內建的**會執行,然後這個內建的**會呼叫我們自定義的**方法而已,也就是說我們定義的**方法是間接被呼叫的

node的事件迴圈不屬於v8引擎的一部分,它由libuv庫提供

process.nexttick:往主線程的同步任務佇列尾部新增乙個任務,這意味著這個任務執行在所有**函式之前

setimmediate:和settimeout(fn,0)類似

可見:process.nexttick 和 setimmediate 相比,前者明顯要高效與後者,因為前者執行在當前的事件迴圈中,不需要去檢查訊息佇列

python 結束迴圈事件 如何終止事件迴圈

首先,您不需要啟動任何事件迴圈。package提供對執行器的直接訪問,threading允許您啟動單個執行緒 raw thread import threading background task threading.thread target update contacts,kwargs loop...

QT事件迴圈

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...

node events事件迴圈

引入event模組 引入模組方式一 引入events模組 var events require events 建立eventemitter var eventemitter new events.eventemitter 引入模組方式二 var eventemitter require events...