首頁 web前端 js教程 nodejs中實作阻塞實例_node.js

nodejs中實作阻塞實例_node.js

May 16, 2016 pm 04:08 PM
nodejs 阻塞

node.js中與生俱來的單執行緒程式設計、回呼函數非同步式風格讓我們有時喜有時憂。先說單線程,很多人會費解於node.js的單線程如何能做到高並發?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在javascript中實現多線程和阻塞(本文用到的方法同樣不是透過V8引擎實現同步的);但對於node .js的其他方面不代表不能多線程,例如IO。如果現在node.js遭受大量請求,而這些請求都是IO密集型的,那麼此時node每接受一個請求,在遇到耗時較長的IO操作時,javascript線程並不會一直在此等待,而是交出控制,在回調堆疊裡加入IO操作完成後要執行的操作(當回呼層級過多,存取數量過大,大量的回調鏈可能會爆棧)。而在這段時間內,node.js又可以處理其他請求了。所以對於node.js而言,雖然javascript是單線程的,每次只能處理一個請求,但javascript處理一個請求的時間往往較短(對於IO密集型應用而言),只要可以異步處理,那麼在處理的過程中,此次請求都會釋放控制,使node.js能處理其他請求。這並發請求的同時,IO其實一直處於並發狀態,減少處理請求的線程數,節約資源以增加IO的線程數,對於通常耗時很長的IO密集型請求來說,無疑能帶來性能上的提升。

前囉嗦嗦嗦地一直在強調IO密集型,其實是在強調node.js的強項。相應的,它的短板就是CPU密集型的請求。道理很簡單,javascript不會並發,只能一個請求完成後才能處理其他請求。一個請求處理的時間越長,其他請求等待的時間越長。同一時間只會有一個請求被處理,並發效能很低。

話說到這兒,我想申明一點:node.js不應該被阻塞;能非同步處理的方法非同步處理(如使用fs.readFile(),而非fs.syncReadFile()fs.readFileSync()方法) 。

node中不能阻塞,不代表node外不能阻塞。前面我們有講到fibers,現在,我們就來嘗試在fibers中實現阻塞。就以處理一個http請求為例吧:

複製程式碼 程式碼如下:

var Fiber = require('fibers');
var http = require("http");
Fiber(function () {
    var httpFiber = Fiber.current;
    var html = "";
    http.get("http://www.baidu.com", function (res) {
        var dataFiber = Fiber.current;
        res.on("data", function (data) {
            html = 數據;
        });
        res.on("end", function (data) {
            httpFiber.run();
        });
    });
    Fiber.yield();
    console.log(html);
}).run();

yield()、 run()這兩個方法還不了解的同學,請自行查閱《fibers in node》。


fibers的運作並不在node進程中,所以在fibers內部實作阻塞對node整體的效能並沒有影響。而且實現起來也是相當容易,只要在想阻塞的時候,把fiber yield掉。需要繼續運行,則執行 run()恢復fiber。在上面的例子中,我們希望當http.get請求發起時阻塞當前程序,當所有資料接收完成時,恢復程序。於是我們在呼叫http.get後使用 Fiber.yield()中斷此fiber。在對response的監聽中,如果觸發end事件顯示資料傳輸完成,於是在end的回呼函數中,呼叫Fiber.current.run()恢復fiber,這樣,後續的程式碼就以同步的方式拿到http.get請求的數據。

上面的範例只是提供一個思路。如果對這種想法進行一些抽象封裝,比如說,對有接受回呼函數為參數的非同步方法進行一步柯里化,在呼叫後中斷,並劫持回呼函數,以恢復程式的程式碼為回呼函數。取得非同步資料後,再程式觸發預定的回呼函數,這樣基本能實現非同步方法同步化。這段說得比較亂,基本上就是 fibers/future的實現思路,如果有興趣,請參考其原始碼

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs和vuejs區別 nodejs和vuejs區別 Apr 21, 2024 am 04:17 AM

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式

See all articles