1. 程式人生 > >單執行緒、事件迴圈和非同步IO

單執行緒、事件迴圈和非同步IO

  • 單執行緒

    Node.js本身是多執行緒的,只是在解釋我們編寫的javascript程式碼時是由一個執行緒完成的,而底層是採用了多執行緒的方式來處理各種I/O操作的。

  • 事件迴圈

    在Node.js啟動動時, 會建立一個類似於while(true)的迴圈,每執行一次迴圈體的過程稱為Tick,這個一直迴圈遍歷待處理事件的機制叫做事件迴圈機制。我的個人理解是遍歷內建的所有觀察者的例項物件。

  • 非同步I/O

    Node.js執行非同步I/O操作示意圖:

    1:當執行IO操作時,Node.js底層會先建立觀察者物件
    2:然後將觀察者物件加入到事件佇列中
    3:成功後會立即返回,這樣就不會影響到JavaScript執行緒的後續執行,就達到了非同步IO的目的。
    4-5-6由Node底層實現:當底層執行緒池獲取到有需要處理的I/O操作,便分配執行緒執行該操作,當執行完後釋放該執行緒,把該事件加入到已完成的I/O佇列中等待處理,這只是為了方便理解畫的示意圖。實際過程是:當主執行緒(我們編寫的Node.js程式碼)有I/O操作時Node.js底層首先建立對應的觀察者物件(檔案、網路等請求)①,然後主執行緒直接返回繼續執行後續的程式碼。同時Node.js遍歷所有的觀察者物件,並判斷是否需要進行I/O操作,如果有則分配執行緒進行I/O處理,處理完成後歸還執行緒,並設定觀察者的I/O操作執行狀態。當Node.js底層再次遍歷觀察者時,發現該物件的I/O操作執行狀態已完成,則通知主執行緒執行響應的回撥函式。②

    個人對①和②的理解為:Node.js底層在每個Tick過程中,取出的觀察者,判斷如果有待處理的I/O事件,則為其分配執行緒進行I/O處理,處理完後修改該觀察者的執行狀態;如果I/O事件的執行狀態已完成,則執行該物件繫結的回撥函式。

<深入淺出Node.js>

相關推薦

執行事件迴圈非同步IO

單執行緒 Node.js本身是多執行緒的,只是在解釋我們編寫的javascript程式碼時是由一個執行緒完成的,而底層是採用了多執行緒的方式來處理各種I/O操作的。 事件迴圈 在Node.js啟動動時, 會建立一個類似於while(true)

執行事件迴圈

單執行緒指的是主執行緒是“單執行緒”的,所有阻塞的部分交給一個執行緒池處理,然後這個主執行緒通過一個佇列跟執行緒池協作,於是對我們寫到的js程式碼部分,不再關心執行緒問題,程式碼也主要由一堆callback回撥構成,然後主執行緒在不停的迴圈過程中,適時呼叫這些程式碼。 什麼是 Event Loo

Node-執行事件驅動非阻塞I/O

Nodejs既然這麼流行就肯定有它的博大精深之處,自然不是我這還沒入門的小白可以掌握的,我就簡單說一下目前自己的理解程度。 一、單執行緒、非阻塞I/O、事件驅動 這是nodejs的三個特點。 單執行緒 Nodejs是單執行緒,和多執行緒相比: 優點:可以避免系統分配多執行緒以及執行

JS-執行事件迴圈任務佇列

JS 是單執行緒的,但是卻能執行非同步任務,這主要是因為 JS 中存在事件迴圈(Event Loop)和任務佇列(Task Queue)。 事件迴圈: JS 會建立一個類似於 while (true) 的迴圈,每執行一次迴圈體的過程稱之為 Tick。每次 Tick 的過程就是檢視是否有待處理事件,如果有則

Nodejs的執行非同步IO事件驅動

Nodejs的最主要的特點就是單執行緒、非同步IO、事件驅動。 單執行緒: 單執行緒其實就是按從上到下順序依次來執行,而且每次只執行一個任務,只有當前這個任務執行完了,才會執行下一個任務。在JS引擎

Python中執行執行多程序的效率對比實驗

Python是執行在直譯器中的語言,查詢資料知道,python中有一個全域性鎖(GIL),在使用多程序(Thread)的情況下,不能發揮多核的優勢。而使用多程序(Multiprocess),則可以發揮多核的優勢真正地提高效率。 對比實驗 資料顯示,如果多執行緒的程序是CPU密集型的,那多執行緒並不能有多少

併發程式設計並行執行同步非同步執行執行阻塞io非阻塞io

一、 cpu的每一個核在同一時間下,只能執行一個執行緒,就是單核同一時間只能執行一個執行緒 而cpu可以不停的切換,這樣就導致使用者感覺可以執行多個執行緒,這是併發,而不是並行 併發和並行 你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支

執行執行以及事件驅動程式設計模型對比

中文版全文:http://blog.csdn.net/hanhuili/article/details/9389433#comments 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來

Python多執行多程序協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

JavaScript是如何工作的:事件迴圈非同步程式設計的崛起 + 5種使用 async/await 更好地編碼方式!

摘要: 深度理解JS事件迴圈!!! 原文:JavaScript是如何工作的:事件迴圈和非同步程式設計的崛起+ 5種使用 async/await 更好地編碼方式! 作者:前端小智 Fundebug經授權轉載,版權歸原作者所有。 此篇是 JavaScript是如何工作的第四篇,其它三篇可以看這

【Qt:語法】Qt 的執行事件迴圈

        週末天冷,索性把電腦抱到床上上網,這幾天看了 dbzhang800 部落格關於 Qt 事件迴圈的幾篇 Blog,發現自己對 Qt 的事件迴圈有不少誤解。從來只看到現象,這次借 dbzhang800 的部落格,就程式碼論事,因此瞭解到一些 Qt 深層的實現,

認識多工多程序執行執行

要認識多執行緒就要從作業系統的原理說起。   以前古老的DOS作業系統(V 6.22)是單任務的,還沒有執行緒的概念,系統在每次只能做一件事情。比如你在copy東西的時候不能rename檔名。為了提高系統的利用效率,採用批處理來批量執行任務。   現在的作業系統都是多工作業

C# 基礎(十四)C#例模式:首先介紹 執行執行加鎖 例模式。然後介紹例模式的執行同步:多執行有序訪問共享記憶體。

一、簡介 本篇文章將介紹如何使用單例模式,也就是類的例項化,在整個專案的生命週期內,只例項化一次。在單例模式中,往往可以看到如SourceCode.cs:這樣的結構的。 SourceCode.cs: public class Singleton { private static

執行執行以及執行安全個人理解

在這裡,我不對多執行緒原理在做闡述。想了解的讀者可以參考:這裡,我將抽象的概念具體化,通過和尚挑水的故事對多執行緒做解釋。1、首先定義和尚類Monkpackage com.stu.thread; /** * 和尚類 * @author jj * */ public

程序執行協程GIL(二)

    上一篇部落格講了程序、執行緒、協程和GIL的基本概念,這篇我們來說說在以下三點:   1> python中使用threading庫來建立執行緒的兩種方式   2> 使用Event對消來判斷執行緒是否已啟動   3> 使用Semaphore和BoundedSemaphore兩個類

Qt執行事件迴圈的正確用法

週末天冷,索性把電腦抱到床上上網,這幾天看了 dbzhang800 部落格關於 Qt 事件迴圈的幾篇 Blog,發現自己對 Qt 的事件迴圈有不少誤解。從來只看到現象,這次借 dbzhang800 的部落格,就程式碼論事,因此瞭解到一些 Qt 深層的實現,雖然是在 Qt

(轉載)Qt 的執行事件迴圈——可列印threadid進行觀察槽函式到底是在哪個執行執行,學習moveToThread的使用)

        從 dbzhang800 的部落格中轉載兩篇關於事件迴圈的文章,放在一起,寫作備忘。         再次提到的一點是:事件迴圈和執行緒沒有必然關係。 QThread 的 run() 方法始終是在一個單獨執行緒執行的,但只有在 run() 方法中使用了 exec() 才真正開啟了一個單獨的事

學習筆記之執行Thread類執行終止相關整理(下)——執行異常&JVM停止

提到執行緒的中斷在某些情況下會丟擲InterruptedException異常,最終導致執行緒的終止。其實,執行緒也有可能由於其他異常原因造成終止,在某些情況下為了做一些妥善的處理,我們需要捕獲這些異常情況。看下面程式碼,覺得會怎樣? 1 2 3 4 5

JavaScript執行之同步任務與非同步任務

JavaScript是單執行緒的,所有任務需要排隊,前一個任務結束,才會執行後一個任務。如果前一個任務耗時很長,後一個任務就不得不一直等著。 如果排隊是因為計算量大,CPU忙不過來,倒也算了,但是

執行事件驅動與推薦引擎框架選型

  事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機